Svaren hittills saknar svar på din fråga:
Det gör knappast någon skillnad om du använder LIKE
eller =
så länge du matchar hela strängen (och det inte finns några jokertecken i). din sträng). För att göra sökningen otydlig måste du byta ut en del av mönstret, inte bara lägga till det.
Till exempel att matcha de sista 7 (istället för 8) tecknen i subcolumn
:
SELECT *
FROM maintable m
WHERE left(maincolumn, 8) LIKE
( '%' || left((SELECT subcolumn FROM subtable WHERE subid = 2), 7));
Jag använder den enklare left()
(introducerat med Postgres 9.1).
Du could
förenkla detta till:
SELECT *
FROM maintable m
WHERE left(maincolumn, 7) =
(SELECT left(subcolumn,7) FROM subtable WHERE subid = 2);
Men du skulle inte göra det om du använder det speciella index som jag nämner längre ner, eftersom uttryck i funktionella index måste matchas exakt för att vara till nytta.
Du kanske är intresserad av tillägget pg_tgrm
.
I PostgreSQL 9.1 körs en gång per databas:
CREATE EXTENSION pg_tgrm;
Två skäl:
-
Den tillhandahåller likhetsoperatorn
%
. Med den kan du bygga en smart likhetssökning:--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);
-
Den tillhandahåller indexstöd för båda
LIKE
och%
Om läsprestanda är viktigare än skrivprestanda, föreslår jag att du skapar en funktionell GIN eller GiST-index så här:
CREATE INDEX maintable_maincol_tgrm_idx ON maintable USING gist (left(maincolumn, 8) gist_trgm_ops);
Detta index stöder båda frågorna. Tänk på att det medför en viss kostnad för skrivoperationer.
Ett snabbt riktmärke för ett liknande fall i detta relaterade svar .