Generelt kan du løse denne type problemer ved at bruge en lagret funktion, skrevet i Java eller Scala (nogle foretrækker måske PL/SQL, C eller C++).
PostgreSql understøtter (Java-baserede) lagrede funktioner, så lad SQL-forespørgslen hente dataene og videregive dem til en lagret funktion. Den gemte funktion returnerer afstanden, så du kan filtrere/sortere osv. på den.
Baseret på en tabel som denne
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}');
med en Java-funktion som denne:
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)); }}
og funktionserklæringen i SQL:
OPRET FUNKTION pljava.distance2(float8[], float8[]) RETURNERER float8 SOM 'PlJava.distance2' UDVIKLET SPROG java;
din forespørgsel kunne se sådan ud:
vælg punkt.*, pljava.distance2(vector, '{1.0, 1.0, 1.0}') som dist fra punktrækkefølge efter dist;
hvilket resulterer i
vektor | dist ---------------+------------------------ {0.5,0.5,0.5} | 0,866025403784439 {0,0,0} | 1,73205080756888
Opdater
Lagrede funktioner kan også skrives i C og C++. C++ kræver mere indsats, fordi grænsefladen til PostgreSql bruger C-kaldekonventionen. Se Brug af C++ til udvidelsesmuligheder