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 .