PostgreSQL
 sql >> डेटाबेस >  >> RDS >> PostgreSQL

DISTINCT कॉल के लिए PostgreSQL प्रकार (बिंदु) के लिए कस्टम समानता ऑपरेटर बनाना

अलग-अलग मानों का चयन करने के लिए 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) कुछ ज्यामितीय कार्यों और ऑपरेटरों के कार्यान्वयन में उपयोग किया जाता है।




  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. स्थानीयहोस्ट पर सीजीआई-बिन चलाते समय आयात त्रुटि - अपरिभाषित प्रतीक:lo_truncate64

  2. टाइपोर्म/टाइपस्क्रिप्ट में अनुरोध टाइमआउट कैसे जोड़ें?

  3. psql प्रांप्ट में रंग

  4. PostgreSQL में लेनदेन अलगाव

  5. विदेशी कुंजी बाधा के कारण वस्तु को हटा नहीं सकता