PostgreSQL
 sql >> Database >  >> RDS >> PostgreSQL

Modelli di corrispondenza tra più colonne

Le risposte finora non rispondono alla tua domanda:

Non fa quasi alcuna differenza se usi LIKE o = purché corrisponda all'intera stringa (e non ci siano caratteri jolly in la tua stringa). Per rendere confusa la ricerca, devi sostituire parte del modello, non solo aggiungerlo.

Ad esempio, per abbinare gli ultimi 7 (anziché 8) caratteri di subcolumn :

SELECT *
FROM   maintable m
WHERE  left(maincolumn, 8) LIKE 
       ( '%' || left((SELECT subcolumn FROM subtable WHERE subid = 2), 7));

Uso il più semplice left() (introdotto con Postgres 9.1).
Tu could semplificalo in:

SELECT *
FROM   maintable m
WHERE  left(maincolumn, 7) =
       (SELECT left(subcolumn,7) FROM subtable WHERE subid = 2);

Ma non lo faresti se usi l'indice speciale che menziono più in basso, perché le espressioni negli indici funzionali devono corrispondere esattamente per essere utili.

Potresti essere interessato all'estensione pg_tgrm .

In PostgreSQL 9.1 esegui una volta per database:

CREATE EXTENSION pg_tgrm;

Due motivi:

  • Fornisce l'operatore di similarità % . Con esso puoi costruire una ricerca intelligente per similarità:

    --SELECT show_limit();
    SELECT set_limit(0.5); -- adjust similarity limit for % operator
    
    SELECT *
    FROM maintable m
    WHERE left(maincolumn, 8) %
          (SELECT subcolumn FROM subtable WHERE subid = 2);
    
  • Fornisce supporto per l'indice per entrambi LIKE e %

    Se le prestazioni in lettura sono più importanti delle prestazioni in scrittura, ti suggerisco di creare un funzionale Indice GIN o GiST come questo:

    CREATE INDEX maintable_maincol_tgrm_idx ON maintable
    USING gist (left(maincolumn, 8) gist_trgm_ops);
    

    Questo indice supporta entrambe le query. Tieni presente che comporta dei costi per le operazioni di scrittura.
    Un rapido benchmark per un caso simile in questa risposta correlata .