PostgreSQL
 sql >> Cơ Sở Dữ Liệu >  >> RDS >> PostgreSQL

Tạo toán tử bình đẳng tùy chỉnh cho kiểu PostgreSQL (điểm) cho các cuộc gọi DISTINCT

Để chọn các giá trị riêng biệt Postgres phải có khả năng sắp xếp cột. Bạn cần tạo một btree hoàn chỉnh lớp toán tử cho điểm loại, tức là năm toán tử (< , <= , = , >= , > ) và một hàm so sánh hai điểm và trả về số nguyên, như được mô tả trong the tài liệu .

Đối với toán tử = bạn có thể sử dụng hàm hiện có point_eq(point, point) :

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

Định nghĩa ví dụ về toán tử < :

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

Xác định các toán tử <= , =>> theo một cách tương tự. Có tất cả năm toán tử, hãy tạo một hàm:

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

Và cuối cùng:

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

Với lớp point_ops được xác định, bạn có thể chọn các giá trị điểm riêng biệt và sắp xếp các hàng theo cột của loại điểm, ví dụ:

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)    

Bạn cũng có thể tạo chỉ mục (duy nhất) trên một cột điểm.

Cập nhật.

Postgres có hơn 2800 hàm phụ hỗ trợ toán tử, chỉ mục, hàm tiêu chuẩn, v.v. Bạn có thể liệt kê chúng bằng cách truy vấn pg_proc , ví dụ:

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

Hàm point_eq(point, point) được sử dụng để triển khai một số hàm hình học và toán tử.




  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Làm thế nào để thực hiện một upert thích hợp bằng cách sử dụng sqlalchemy trên postgresql?

  2. Hàm PostgreSQL trả về nhiều tập kết quả

  3. Máy chủ Postgres không phản hồi yêu cầu nodejs

  4. PostgreSQL có thể lập chỉ mục các cột mảng không?

  5. Trường hợp với các thực thể doct2, symfony2 và postgresql