Svarene hidtil ikke besvarer dit spørgsmål:
Det gør næppe nogen forskel, om du bruger LIKE
eller =
så længe du matcher hele strengen (og der er ingen jokertegn i). din streng). For at gøre søgningen uklar, skal du erstate en del af mønsteret, ikke bare tilføje til det.
For eksempel at matche de sidste 7 (i stedet for 8) tegn i subcolumn
:
SELECT *
FROM maintable m
WHERE left(maincolumn, 8) LIKE
( '%' || left((SELECT subcolumn FROM subtable WHERE subid = 2), 7));
Jeg bruger den enklere left()
(introduceret med Postgres 9.1).
Du could
forenkle dette til:
SELECT *
FROM maintable m
WHERE left(maincolumn, 7) =
(SELECT left(subcolumn,7) FROM subtable WHERE subid = 2);
Men det ville du ikke, hvis du bruger det specielle indeks, jeg nævner længere nede, fordi udtryk i funktionelle indekser skal matches præcist for at være til brug.
Du kan være interesseret i udvidelsen pg_tgrm
.
I PostgreSQL 9.1 køres én gang pr. database:
CREATE EXTENSION pg_tgrm;
To grunde:
-
Den leverer lighedsoperatoren
%
. Med den kan du bygge en smart lighedssøgning:--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);
-
Det giver indeksstøtte for begge
LIKE
og%
Hvis læseydelse er vigtigere end skriveydelse, foreslår jeg, at du opretter en funktionel GIN- eller GiST-indeks som dette:
CREATE INDEX maintable_maincol_tgrm_idx ON maintable USING gist (left(maincolumn, 8) gist_trgm_ops);
Dette indeks understøtter begge forespørgsler. Vær opmærksom på, at det medfører nogle omkostninger til skriveoperationer.
En hurtig benchmark for en lignende sag i dette relaterede svar .