Im Allgemeinen können Sie diese Art von Problemen lösen, indem Sie eine gespeicherte Funktion verwenden, die in Java oder Scala geschrieben ist (einige bevorzugen möglicherweise PL/SQL, C oder C++).
PostgreSql unterstützt (Java-basierte) gespeicherte Funktionen, also lassen Sie die SQL-Abfrage die Daten abrufen und an eine gespeicherte Funktion übergeben. Die gespeicherte Funktion gibt die Entfernung zurück, sodass Sie danach filtern/sortieren usw. können.
Basierend auf einer Tabelle wie dieser
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}');
mit einer Java-Funktion wie dieser:
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));
}
}
und die Funktionsdeklaration in SQL:
CREATE FUNCTION pljava.distance2(float8[], float8[])
RETURNS float8
AS 'PlJava.distance2'
IMMUTABLE
LANGUAGE java;
Ihre Abfrage könnte so aussehen:
select
point.*,
pljava.distance2(vector, '{1.0, 1.0, 1.0}') as dist
from
point
order by
dist;
was zu
führt vector | dist
---------------+-------------------
{0.5,0.5,0.5} | 0.866025403784439
{0,0,0} | 1.73205080756888
Aktualisieren
Gespeicherte Funktionen können auch in C und C++ geschrieben werden. C++ erfordert mehr Aufwand, da die Schnittstelle zu PostgreSql die C-Aufrufkonvention verwendet. Siehe C++ für Erweiterbarkeit verwenden