PostgreSQL
 sql >> база данни >  >> RDS >> PostgreSQL

Създаване на персонализиран оператор за равенство за тип PostgreSQL (точка) за DISTINCT извиквания

За да изберете отделни стойности, Postgres трябва да има способността да сортира колоната. Трябва да създадете пълно btree операторски клас за тип point, т.е. пет оператора (< , <= , = , >= , > ) и функция, сравняваща две точки и връщаща цяло число, както е описано в документация .

За оператора = можете да използвате съществуващата функция point_eq(point, point) :

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

Примерна дефиниция на оператор < :

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

Дефинирайте операторите <= , => и > по подобен начин. Имайки всичките пет оператора, създайте функция:

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

И накрая:

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

С класа point_ops дефинирани можете да избирате отделни стойности на точки и да подреждате редове по колона от тип точка, напр.:

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)    

Можете също да създадете (уникален) индекс върху колона с точки.

Актуализация.

Postgres има над 2800 помощни функции, които поддържат оператори, индекси, стандартни функции и т.н. Можете да ги изброите чрез заявка pg_proc , напр.:

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

Функцията point_eq(point, point) се използва при внедряване на някои геометрични функции и оператори.




  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Cascade persist създава дублиращи се редове?

  2. Zip файл в байтове Python 3

  3. Как мога да тествам дали колона съществува в таблица, използвайки SQL израз

  4. Има ли начин за индексиране в postgres за бързо търсене на подниз

  5. PostgreSQL - групиране по jsonb колона