Най-общо казано, можете да решите този тип проблеми, като използвате съхранена функция, написана на Java или Scala (някои може да предпочетат PL/SQL, C или C++).
PostgreSql поддържа (базирани на Java) съхранени функции, така че оставете SQL заявката да извлече данните и да ги предаде на съхранена функция. Съхранената функция връща разстоянието, така че можете да филтрирате/сортирате и т.н. върху нея.
Въз основа на таблица като тази
създаване на точка на таблица(вектор float8[]);вмъкване в стойности на точки('{0.0, 0.0, 0.0}');вмъкване в стойности на точки('{0.5, 0.5, 0.5}');код>
с функция на Java като тази:
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)); }}
и декларацията на функцията в SQL:
CREATE FUNCTION pljava.distance2(float8[], float8[]) ВРЪЩА float8 КАТО 'PlJava.distance2' НЕИЗМЕНЕН ЕЗИК java;
вашата заявка може да изглежда така:
изберете точка.*, pljava.distance2(vector, '{1.0, 1.0, 1.0}') като разстояние от точка ред по разстояние;
което води до
<пре> вектор | dist ---------------+------------------- {0.5,0.5,0.5} | 0,866025403784439 {0,0,0} | 1.73205080756888
Актуализиране
Съхранените функции могат да бъдат написани и на C и C++. C++ изисква повече усилия, тъй като интерфейсът към PostgreSql използва C конвенцията за извикване. Вижте Използване на C++ за разширяемост