Die bisherigen Antworten gehen nicht auf Ihre Frage ein:
Dabei spielt es kaum eine Rolle, ob Sie LIKE
verwenden oder =
solange Sie mit der gesamten Zeichenfolge übereinstimmen (und es kein Platzhalterzeichen in gibt deine Saite). Um die Suche unscharf zu machen, müssen Sie ersetzen Teil des Musters, nicht nur hinzufügen.
Zum Beispiel, um die letzten 7 (statt 8) Zeichen von subcolumn
abzugleichen :
SELECT *
FROM maintable m
WHERE left(maincolumn, 8) LIKE
( '%' || left((SELECT subcolumn FROM subtable WHERE subid = 2), 7));
Ich verwende das einfachere left()
(eingeführt mit Postgres 9.1).
Sie could
Vereinfachen Sie dies zu:
SELECT *
FROM maintable m
WHERE left(maincolumn, 7) =
(SELECT left(subcolumn,7) FROM subtable WHERE subid = 2);
Aber Sie würden es nicht tun, wenn Sie den speziellen Index verwenden, den ich weiter unten erwähne, da Ausdrücke in funktionalen Indizes genau übereinstimmen müssen, um von Nutzen zu sein.
Sie könnten an der Erweiterung pg_tgrm
interessiert sein
.
In PostgreSQL 9.1 einmal pro Datenbank ausführen:
CREATE EXTENSION pg_tgrm;
Zwei Gründe:
-
Es liefert den Ähnlichkeitsoperator
%
. Damit können Sie eine intelligente Ähnlichkeitssuche aufbauen:--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);
-
Es bietet Indexunterstützung für beide
LIKE
und%
Wenn die Leseleistung wichtiger ist als die Schreibleistung, schlage ich vor, dass Sie einen erstellen funktionsfähig GIN- oder GiST-Index wie folgt:
CREATE INDEX maintable_maincol_tgrm_idx ON maintable USING gist (left(maincolumn, 8) gist_trgm_ops);
Dieser Index unterstützt beide Abfragen. Beachten Sie, dass Schreibvorgänge mit einigen Kosten verbunden sind.
Ein schneller Benchmark für einen ähnlichen Fall in dieser verwandten Antwort .