Отговорите досега не отговарят на вашия въпрос:
Няма никаква разлика дали използвате LIKE
или =
стига да съответствате на целия низ (и няма заместващ знак in вашият низ). За да направите търсенето размито, трябва да замените част от шаблона, а не просто добавяне към него.
Например, за съпоставяне на последните 7 (вместо 8) знака на subcolumn
:
SELECT *
FROM maintable m
WHERE left(maincolumn, 8) LIKE
( '%' || left((SELECT subcolumn FROM subtable WHERE subid = 2), 7));
Използвам по-простия left()
(въведено с Postgres 9.1).
Вие could
опростете това до:
SELECT *
FROM maintable m
WHERE left(maincolumn, 7) =
(SELECT left(subcolumn,7) FROM subtable WHERE subid = 2);
Но не бихте го направили, ако използвате специалния индекс, който споменах по-долу, защото изразите във функционалните индекси трябва да съвпадат точно, за да бъдат полезни.
Може да се интересувате от разширението pg_tgrm
.
В PostgreSQL 9.1 стартирайте веднъж за база данни:
CREATE EXTENSION pg_tgrm;
Две причини:
-
Той предоставя оператора за подобие
%
. С него можете да създадете интелигентно търсене по сходство:--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);
-
Той предоставя поддръжка на индекс и за двете
LIKE
и%
Ако производителността при четене е по-важна от производителността при запис, предлагам ви да създадете функционален GIN или GiST индекс като този:
CREATE INDEX maintable_maincol_tgrm_idx ON maintable USING gist (left(maincolumn, 8) gist_trgm_ops);
Този индекс поддържа и двете заявки. Имайте предвид, че идва с известни разходи за операции по запис.
Бърз бенчмарк за подобен случай в този свързан отговор .