De um modo geral, você pode resolver esse tipo de problema usando uma função armazenada, escrita em Java ou Scala (alguns podem preferir PL/SQL, C ou C++).
PostgreSql suporta funções armazenadas (baseadas em Java), então deixe a consulta SQL buscar os dados e passá-los para uma função armazenada. A função armazenada retorna a distância, para que você possa filtrar/classificar etc. nela.
Com base em uma tabela como esta
criar ponto de tabela(vetor float8[]);inserir em valores de ponto('{0.0, 0.0, 0.0}');inserir em valores de ponto('{0.5, 0.5, 0.5}');
com uma função Java como esta:
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)); }}
e a declaração da função em SQL:
CRIAR FUNÇÃO pljava.distance2(float8[], float8[]) RETORNA float8 AS 'PlJava.distance2' IDIOMA IMUTÁVEL java;
sua consulta pode ficar assim:
select point.*, pljava.distance2(vector, '{1.0, 1.0, 1.0}') as dist da ordem dos pontos por dist;
o que resulta em
Atualizar
As funções armazenadas também podem ser escritas em C e C++. C++ requer mais esforço, porque a interface para PostgreSql está usando a convenção de chamada C. Consulte Usando C++ para extensibilidade