sql >> データベース >  >> RDS >> PostgreSQL

DISTINCT呼び出し用のPostgreSQLタイプ(ポイント)のカスタム等式演算子の作成

    個別の値を選択するには、Postgresに列を並べ替える機能が必要です。完全なbtree オペレータークラス タイプポイントの場合、つまり5つの演算子( < <= => => )およびで説明されているように、2つのポイントを比較して整数を返す関数ドキュメント

    演算子=の場合 既存の関数point_eq(point、point)を使用できます :

    create operator = (leftarg = point, rightarg = point, procedure = point_eq, commutator = =);
    

    演算子<の定義例 :

    create function point_lt(point, point)
    returns boolean language sql immutable as $$
        select $1[0] < $2[0] or $1[0] = $2[0] and $1[1] < $2[1]
    $$;
    
    create operator < (leftarg = point, rightarg = point, procedure = point_lt, commutator = >);
    

    演算子<=を定義します 、 => および> 似たような方法で。 5つの演算子すべてを使用して、関数を作成します。

    create function btpointcmp(point, point)
    returns integer language sql immutable as $$
        select case 
            when $1 = $2 then 0
            when $1 < $2 then -1
            else 1
        end
    $$;
    

    そして最後に:

    create operator class point_ops
        default for type point using btree as
            operator 1 <,
            operator 2 <=,
            operator 3 =,
            operator 4 >=,
            operator 5 >,
            function 1 btpointcmp(point, point);
    

    クラスpoint_ops 定義済みの場合、個別のポイント値を選択し、ポイントタイプの列で行を並べ替えることができます(例:

    )。
    with q(p) as (
        values 
            ('(1,1)'::point),
            ('(1,2)'::point),
            ('(2,1)'::point),
            ('(1,1)'::point))
    select distinct *
    from q
    order by 1 desc;
    
       p   
    -------
     (2,1)
     (1,2)
     (1,1)
    (3 rows)    
    

    ポイント列に(一意の)インデックスを作成することもできます。

    アップデート。

    Postgresには、演算子、インデックス、標準関数などをサポートする2800を超える補助関数があります。 pg_proc 、 例:

    select format('%s(%s)', proname, pg_get_function_arguments(oid))
    from pg_proc
    where pronamespace::regnamespace = 'pg_catalog'
    and proname like 'point%'
    

    関数point_eq(point、point) 一部の幾何関数と演算子 の実装で使用されます。




    1. MySqlでvarcharの長さを増やすことで起こりうる結果は?

    2. PHPを使用してチェックボックスを使用してmysqlデータベースから複数の行を削除するにはどうすればよいですか?

    3. Oracleクライアントとネットワークコンポーネントが見つかりませんでした

    4. 高度な合計集計フィールド