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

PostgreSQL để lặp qua các hàng và tìm kết quả phù hợp nhất bằng cách sử dụng hàm khoảng cách tùy chỉnh

Nói chung, bạn có thể giải quyết loại vấn đề này bằng cách sử dụng một hàm được lưu trữ, được viết bằng Java hoặc Scala (một số có thể thích PL / SQL, C hoặc C ++).

PostgreSql hỗ trợ các hàm được lưu trữ (dựa trên Java), vì vậy hãy để truy vấn SQL tìm nạp dữ liệu và chuyển nó đến một hàm được lưu trữ. Hàm được lưu trữ trả về khoảng cách, vì vậy bạn có thể lọc / sắp xếp, v.v. trên đó.

Dựa trên một bảng như thế này

create table point(vector float8[]);
insert into point values('{0.0, 0.0, 0.0}');
insert into point values('{0.5, 0.5, 0.5}');

với một hàm Java như thế này:

public class PlJava {
    public final static double distance2(double[] v1, double[] v2) {
        return Math.sqrt(Math.pow(v2[0] - v1[0], 2)
          + Math.pow(v2[1] - v1[1], 2) + Math.pow(v2[2] - v1[2], 2));
    }
}

và khai báo hàm trong SQL:

CREATE FUNCTION pljava.distance2(float8[], float8[])
  RETURNS float8
  AS 'PlJava.distance2'
  IMMUTABLE
  LANGUAGE java;

truy vấn của bạn có thể trông giống như sau:

select
    point.*, 
    pljava.distance2(vector, '{1.0, 1.0, 1.0}') as dist
  from
    point 
  order by
    dist;    

kết quả là

    vector     |       dist  
---------------+-------------------  
 {0.5,0.5,0.5} | 0.866025403784439  
 {0,0,0}       |  1.73205080756888  

Cập nhật

Các hàm được lưu trữ cũng có thể được viết bằng C và C ++. C ++ đòi hỏi nhiều nỗ lực hơn, vì giao diện của PostgreSql đang sử dụng quy ước gọi C. Xem Sử dụng C ++ để mở rộng



  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Truy vấn bỏ qua khoảng trắng

  2. Rails Postgresql nhiều lược đồ và cùng một tên bảng

  3. Postgres thời gian với múi giờ bình đẳng

  4. SQL Điền bảng với dữ liệu ngẫu nhiên

  5. Cách liệt kê tất cả người dùng trong PostgreSQL