sql >> Database >  >> RDS >> PostgreSQL

Aangepaste gelijkheidsoperator maken voor PostgreSQL-type (punt) voor DISTINCT-aanroepen

Om verschillende waarden te selecteren, moet Postgres de mogelijkheid hebben om de kolom te sorteren. U moet een volledige btree maken operatorklasse voor typepunt, d.w.z. vijf operators (< , <= , = , >= , > ) en een functie die twee punten vergelijkt en een geheel getal retourneert, zoals beschreven in de documentatie .

Voor de operator = je kunt de bestaande functie gebruiken point_eq(point, point) :

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

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

Definieer de operatoren <= , => en > op een soortgelijke manier. Maak een functie met alle vijf operators:

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

En tot slot:

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

Met de klasse point_ops gedefinieerd kunt u verschillende puntwaarden selecteren en rijen rangschikken op de kolom van het type punt, bijvoorbeeld:

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)    

U kunt ook een (unieke) index maken op een puntkolom.

Update.

Postgres heeft meer dan 2800 hulpfuncties die operators, indexen, standaardfuncties, enz. ondersteunen. U kunt ze weergeven door pg_proc , bijv.:

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

De functie point_eq(point, point) wordt gebruikt bij de implementatie van enkele geometrische functies en operators.




  1. qt 5.8 sql-verbindingsfout:QMYSQL-stuurprogramma niet geladen op Windows 10

  2. De pt-pg-summary Percona Toolkit voor PostgreSQL gebruiken

  3. ROWIDTOCHAR() Functie in Oracle

  4. Hoe voer ik een SQL-query uit naar woorden met interpunctie in Postgresql?