За да изберете отделни стойности, Postgres трябва да има способността да сортира колоната. Трябва да създадете пълно btree операторски клас
за тип point, т.е. пет оператора (<
, <=
, =
, >=код> ,
>код> ) и функция, сравняваща две точки и връщаща цяло число, както е описано в документация
.
За оператора =
можете да използвате съществуващата функция 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 = >);
Дефинирайте операторите <=
, =>код> и
>код> по подобен начин. Имайки всичките пет оператора, създайте функция:
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)
се използва при внедряване на някои геометрични функции и оператори.