Dotychczasowe odpowiedzi nie odpowiadają na Twoje pytanie:
Nie ma prawie żadnej różnicy, czy używasz LIKE
lub =
tak długo, jak pasujesz do całego ciągu (i nie ma znaku wieloznacznego w Twój ciąg). Aby wyszukiwanie było rozmyte, musisz zamienić częścią wzoru, a nie tylko do niego dodawaj.
Na przykład, aby dopasować ostatnie 7 (zamiast 8) znaków w subcolumn
:
SELECT *
FROM maintable m
WHERE left(maincolumn, 8) LIKE
( '%' || left((SELECT subcolumn FROM subtable WHERE subid = 2), 7));
Używam prostszego left()
(wprowadzony w Postgresie 9.1).
Ty could
uprość to do:
SELECT *
FROM maintable m
WHERE left(maincolumn, 7) =
(SELECT left(subcolumn,7) FROM subtable WHERE subid = 2);
Ale nie zrobiłbyś tego, gdybyś używał specjalnego indeksu, o którym wspomniałem poniżej, ponieważ wyrażenia w indeksach funkcjonalnych muszą być dokładnie dopasowane, aby były użyteczne.
Być może zainteresuje Cię rozszerzenie pg_tgrm
.
W PostgreSQL 9.1 uruchom raz na bazę danych:
CREATE EXTENSION pg_tgrm;
Dwa powody:
-
Dostarcza operator podobieństwa
%
. Dzięki niemu możesz zbudować inteligentne wyszukiwanie podobieństw:--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);
-
Zapewnia obsługę indeksowania dla obu
LIKE
i%
Jeśli wydajność odczytu jest ważniejsza niż wydajność zapisu, sugeruję utworzenie funkcjonalny Indeks GIN lub GiST w następujący sposób:
CREATE INDEX maintable_maincol_tgrm_idx ON maintable USING gist (left(maincolumn, 8) gist_trgm_ops);
Ten indeks obsługuje oba zapytania. Pamiętaj, że wiąże się to z pewnymi kosztami operacji zapisu.
Szybki test porównawczy dla podobnego przypadku w tej powiązanej odpowiedzi .