sql >> Database >  >> RDS >> PostgreSQL

PostgreSQL om door rijen te bladeren en de dichtstbijzijnde overeenkomst te vinden met behulp van de aangepaste afstandsfunctie

Over het algemeen kun je dit soort problemen oplossen door een opgeslagen functie te gebruiken, geschreven in Java of Scala (sommigen geven misschien de voorkeur aan PL/SQL, C of C++).

PostgreSql ondersteunt (op Java gebaseerde) opgeslagen functies, dus laat de SQL-query de gegevens ophalen en doorgeven aan een opgeslagen functie. De opgeslagen functie retourneert de afstand, zodat u erop kunt filteren/sorteren enz.

Gebaseerd op een tabel als deze

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}');

met een Java-functie zoals deze:

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));
    }
}

en de functiedeclaratie in SQL:

CREATE FUNCTION pljava.distance2(float8[], float8[])
  RETURNS float8
  AS 'PlJava.distance2'
  IMMUTABLE
  LANGUAGE java;

uw zoekopdracht kan er als volgt uitzien:

select
    point.*, 
    pljava.distance2(vector, '{1.0, 1.0, 1.0}') as dist
  from
    point 
  order by
    dist;    

wat resulteert in

    vector     |       dist  
---------------+-------------------  
 {0.5,0.5,0.5} | 0.866025403784439  
 {0,0,0}       |  1.73205080756888  

Bijwerken

Opgeslagen functies kunnen ook in C en C++ worden geschreven. C++ vereist meer inspanning, omdat de interface naar PostgreSql de C-aanroepconventie gebruikt. Zie C++ gebruiken voor uitbreidbaarheid



  1. Sql 2008 Developer naar Sql Azure Migratie

  2. Mysql TIME converteren van 24 uur naar AM/PM-formaat

  3. URL herschrijven, ID vervangen door titel in queryreeks

  4. 2 tabellen samenvoegen voor een SELECT-query?