PostgreSQL
 sql >> Datenbank >  >> RDS >> PostgreSQL

PostgreSQL, um Zeilen zu durchlaufen und mithilfe der benutzerdefinierten Abstandsfunktion die engste Übereinstimmung zu finden

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