sql >> Databáze >  >> RDS >> PostgreSQL

Vytvoření vlastního operátoru rovnosti pro typ PostgreSQL (bod) pro DISTINCT volání

Chcete-li vybrat odlišné hodnoty, musí mít Postgres schopnost seřadit sloupec. Musíte vytvořit úplný bstrom třída operátora pro typ bod, tj. pět operátorů (< , <= , = , >= , > ) a funkce porovnávající dva body a vracející celé číslo, jak je popsáno v dokumentaci .

Pro operátor = můžete použít stávající funkci point_eq(point, point) :

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

Příklad definice operátoru < :

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

Definujte operátory <= , => a > podobným způsobem. Se všemi pěti operátory vytvořte funkci:

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

A nakonec:

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

Pomocí třídy point_ops definované můžete vybrat odlišné bodové hodnoty a seřadit řádky podle sloupce typu bod, např.:

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)    

Můžete také vytvořit (jedinečný) index na bodovém sloupci.

Aktualizace.

Postgres má více než 2800 pomocných funkcí, které podporují operátory, indexy, standardní funkce atd. Můžete je vypsat dotazem pg_proc , např.:

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

Funkce point_eq(point, point) se používá při implementaci některých geometrických funkcí a operátorů.




  1. Vrací sadu řádků z funkce plpgsql.

  2. PHP připravovalo výpisy a transakce ve smyčce

  3. Entity Framework Cascade Delete

  4. Nesprávná velikost odpovědi COM_STMT_PREPARE. Přijato 7. LARAVEL ERROR