Secara umum Anda dapat memecahkan masalah jenis ini dengan menggunakan fungsi tersimpan, yang ditulis dalam Java atau Scala (beberapa mungkin lebih suka PL/SQL, C atau C++).
PostgreSql mendukung fungsi tersimpan (berbasis Java), jadi biarkan kueri SQL mengambil data, dan meneruskannya ke fungsi tersimpan. Fungsi yang disimpan mengembalikan jarak, sehingga Anda dapat memfilter/mengurutkan dll. di atasnya.
Berdasarkan tabel seperti ini
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}');
dengan fungsi Java seperti ini:
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));
}
}
dan deklarasi fungsi dalam SQL:
CREATE FUNCTION pljava.distance2(float8[], float8[])
RETURNS float8
AS 'PlJava.distance2'
IMMUTABLE
LANGUAGE java;
kueri Anda dapat terlihat seperti ini:
select
point.*,
pljava.distance2(vector, '{1.0, 1.0, 1.0}') as dist
from
point
order by
dist;
yang menghasilkan
vector | dist
---------------+-------------------
{0.5,0.5,0.5} | 0.866025403784439
{0,0,0} | 1.73205080756888
Perbarui
Fungsi yang disimpan dapat ditulis dalam C dan C++ juga. C++ membutuhkan lebih banyak usaha, karena antarmuka ke PostgreSql menggunakan konvensi pemanggilan C. Lihat Menggunakan C++ untuk Ekstensibilitas