個別の値を選択するには、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)
一部の