Ответ 1
Ответы до сих пор не могут решить ваш вопрос:
но я хочу использовать Like,%, _ etc в моем запросе, чтобы я мог свободно совпадать шаблон (это не все 8 символов).
Вряд ли вы используете LIKE
или =
, если вы соответствуете всей строке (и в вашей строке нет символа подстановки). Чтобы сделать поиск нечетким, вам нужно заменить часть шаблона, а не просто добавлять к нему.
Например, чтобы сопоставить последние 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
и%
Если производительность чтения важнее производительности записи, я предлагаю вам создать function GIN или индекс GiST следующим образом:
CREATE INDEX maintable_maincol_tgrm_idx ON maintable USING gist (left(maincolumn, 8) gist_trgm_ops);
Этот индекс поддерживает любой запрос. Имейте в виду, что он поставляется с некоторой стоимостью для операций записи.
Быстрый тест для аналогичного случая в этом связанном ответе.