PostgreSQL
 sql >> Baza danych >  >> RDS >> PostgreSQL

Tworzenie własnego operatora równości dla typu PostgreSQL (punkt) dla wywołań DISTINCT

Aby wybrać odrębne wartości, Postgres musi mieć możliwość sortowania kolumny.Musisz utworzyć pełne drzewo klasa operatora dla punktu typu, czyli pięciu operatorów (< , <= , = , >= , > ) oraz funkcję porównującą dwa punkty i zwracającą liczbę całkowitą, jak opisano w dokumentacja .

Dla operatora = możesz użyć istniejącej funkcji point_eq(point, point) :

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

Przykładowa definicja operatora < :

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

Zdefiniuj operatory <= , => i > w podobny sposób. Mając wszystkich pięciu operatorów, utwórz funkcję:

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

I na koniec:

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

Z klasą point_ops zdefiniowane można wybrać różne wartości punktowe i uporządkować wiersze według kolumny typu punkt, np.:

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)    

Możesz także utworzyć (unikalny) indeks w kolumnie punktowej.

Aktualizacja.

Postgres ma ponad 2800 funkcji pomocniczych, które obsługują operatory, indeksy, funkcje standardowe itp. Możesz je wyświetlić, pytając pg_proc , np.:

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

Funkcja point_eq(punkt, punkt) jest używany w implementacji niektórych funkcji i operatorów geometrycznych.




  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Używanie zmiennego okresu w interwale w Postgres

  2. Jak obliczyć sumę wielu kolumn w PostgreSQL

  3. Połączenie Pyspark z bazą danych Postgres w notatniku ipython

  4. Wybierz losowy wiersz dla każdej grupy

  5. Praca z widokiem Postgres/PostGIS w SQLAlchemy