De antwoorden tot nu toe beantwoorden niet aan uw vraag:
Het maakt nauwelijks uit of je LIKE
. gebruikt of =
zolang je de hele string matcht (en er zijn geen jokertekens in je snaar). Om de zoekopdracht vaag te maken, moet u vervangen deel van het patroon, niet alleen toevoegen.
Bijvoorbeeld om overeen te komen met de laatste 7 (in plaats van 8) tekens van subcolumn
:
SELECT *
FROM maintable m
WHERE left(maincolumn, 8) LIKE
( '%' || left((SELECT subcolumn FROM subtable WHERE subid = 2), 7));
Ik gebruik de eenvoudigere left()
(geïntroduceerd met Postgres 9.1).
U could
vereenvoudig dit tot:
SELECT *
FROM maintable m
WHERE left(maincolumn, 7) =
(SELECT left(subcolumn,7) FROM subtable WHERE subid = 2);
Maar dat zou je niet doen als je de speciale index gebruikt die ik verderop vermeld, omdat uitdrukkingen in functionele indexen precies moeten matchen om bruikbaar te zijn.
Mogelijk bent u geïnteresseerd in de extensie pg_tgrm
.
Voer in PostgreSQL 9.1 eenmaal per database uit:
CREATE EXTENSION pg_tgrm;
Twee redenen:
-
Het levert de overeenkomstoperator
%
. Hiermee kunt u een slimme zoekopdracht naar overeenkomsten bouwen:--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);
-
Het levert indexondersteuning voor beide
LIKE
en%
Als leesprestaties belangrijker zijn dan schrijfprestaties, raad ik u aan een te maken functioneel GIN- of GiST-index als volgt:
CREATE INDEX maintable_maincol_tgrm_idx ON maintable USING gist (left(maincolumn, 8) gist_trgm_ops);
Deze index ondersteunt beide zoekopdrachten. Houd er rekening mee dat schrijfbewerkingen wat kosten met zich meebrengen.
Een snelle benchmark voor een vergelijkbaar geval in dit gerelateerde antwoord .