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