PostgreSQL
 sql >> Teknologi Basis Data >  >> RDS >> PostgreSQL

Membuat operator kesetaraan khusus untuk tipe PostgreSQL (titik) untuk panggilan DISTINCT

Untuk memilih nilai yang berbeda, Postgres harus memiliki kemampuan untuk mengurutkan kolom. Anda perlu membuat btree lengkap kelas operator untuk titik tipe, yaitu lima operator (< , <= , = , >= , > ) dan fungsi yang membandingkan dua titik dan mengembalikan bilangan bulat, seperti yang dijelaskan dalam dokumentasi .

Untuk operator = anda dapat menggunakan fungsi yang ada point_eq(point, point) :

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

Contoh definisi operator < :

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 = >);

Tentukan operator <= , => dan > dengan cara yang sama. Memiliki kelima operator, buat fungsi:

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
$$;

Dan akhirnya:

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);

Dengan kelas point_ops ditentukan, Anda dapat memilih nilai titik yang berbeda dan mengurutkan baris berdasarkan kolom tipe titik, mis.:

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)    

Anda juga dapat membuat indeks (unik) pada kolom titik.

Memperbarui.

Postgres memiliki lebih dari 2800 fungsi tambahan yang mendukung operator, indeks, fungsi standar, dll. Anda dapat mencantumkannya dengan menanyakan pg_proc , misalnya:

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

Fungsi point_eq(point, point) digunakan dalam implementasi beberapa fungsi dan operator geometris.




  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Bagaimana saya bisa mendapatkan baris INSERTED dan UPDATED untuk operasi UPSERT di postgres

  2. Cara membuat ubin OSM

  3. Optimalisasi kecepatan basis data:beberapa tabel dengan banyak baris, atau banyak tabel dengan beberapa baris?

  4. Bagaimana cara membuat INTERSECT menggunakan Eloquent Builder tanpa memiliki koleksi

  5. Postgres KIRI GABUNG dengan SUM, catatan hilang