अलग-अलग मानों का चयन करने के लिए Postgres में कॉलम को सॉर्ट करने की क्षमता होनी चाहिए। आपको एक पूर्ण btree बनाने की आवश्यकता है ऑपरेटर वर्ग
टाइप पॉइंट के लिए, यानी पांच ऑपरेटर (<
, <=
, =
, >=
, >
) और एक फ़ंक्शन दो बिंदुओं और रिटर्निंग पूर्णांक की तुलना करता है, जैसा कि में वर्णित है। दस्तावेज़ीकरण
।
ऑपरेटर के लिए =
आप मौजूदा फ़ंक्शन का उपयोग कर सकते हैं 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)
कुछ ज्यामितीय कार्यों और ऑपरेटरों के कार्यान्वयन में उपयोग किया जाता है।