sql >> Database teknologi >  >> RDS >> PostgreSQL

Oprettelse af tilpasset ligestillingsoperatør for PostgreSQL-typen (punkt) for DISTINCT-opkald

For at vælge distinkte værdier skal Postgres have mulighed for at sortere kolonnen. Du skal oprette et komplet btræ operatørklasse for typepunkt, dvs. fem operatorer (< , <= , = , >= , > ) og en funktion, der sammenligner to punkter og returnerer heltal, som det er beskrevet i denne dokumentation .

For operatøren = du kan bruge den eksisterende funktion point_eq(point, point) :

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

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

Definer operatorerne <= , => og > på lignende måde. Med alle fem operatører skal du oprette en funktion:

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

Og til sidst:

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

Med klassen point_ops defineret kan du vælge forskellige punktværdier og rækkefølge efter kolonnen med typepunkt, f.eks.:

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)    

Du kan også oprette (unikt) indeks på en punktkolonne.

Opdatering.

Postgres har over 2800 hjælpefunktioner, der understøtter operatører, indekser, standardfunktioner osv. Du kan liste dem ved at forespørge pg_proc , f.eks.:

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

Funktionen point_eq(point, point) bruges til implementering af nogle geometriske funktioner og operatorer.




  1. Migrering af en Oracle-database fra AWS EC2 til AWS RDS, del 4

  2. MY SQL - Fejlkode:1010. Fejl ved sletning af database (kan ikke rmdir; fejlnr:13)

  3. 2 måder at formatere dine forespørgselsresultater i SQLcl (Oracle)

  4. Tilladelser Problem med at køre SSIS-pakke fra SQL Job