PostgreSQL подстановочный знак LIKE для любого списка слов - PullRequest
126 голосов
/ 08 февраля 2011

У меня есть простой список из ~ 25 слов.У меня есть поле varchar в PostgreSQL, скажем, список ['foo', 'bar', 'baz'].Я хочу найти в моей таблице любую строку, в которой есть любое из этих слов.Это будет работать, но я бы хотел что-то более элегантное.

select *
from table
where (lower(value) like '%foo%' or lower(value) like '%bar%' or lower(value) like '%baz%')

Ответы [ 4 ]

188 голосов
/ 08 февраля 2011

PostgreSQL также поддерживает полные регулярные выражения POSIX :

select * from table where value ~* 'foo|bar|baz';

~* для нечувствительного к регистру соответствия, ~ чувствительно к регистру.

Другой вариант - использовать ANY :

select * from table where value  like any (array['%foo%', '%bar%', '%baz%']);
select * from table where value ilike any (array['%foo%', '%bar%', '%baz%']);

Вы можете использовать ANY с любым оператором, который выдает логическое значение.Я подозреваю, что параметры регулярных выражений были бы быстрее, но ЛЮБОЙ это полезный инструмент в вашем наборе инструментов.

129 голосов
/ 08 февраля 2011

Вы можете использовать оператор Postgres 'SIMILAR TO, который поддерживает чередования, т.е.

select * from table where lower(value) similar to '%(foo|bar|baz)%';
6 голосов
/ 09 октября 2017

На самом деле в PostgreSQL для этого есть оператор:

SELECT *
FROM table
WHERE lower(value) ~~ ANY('{%foo%,%bar%,%baz%}');
1 голос
/ 08 февраля 2011

Одним из «элегантных» решений будет использование полнотекстового поиска: http://www.postgresql.org/docs/9.0/interactive/textsearch.html. Тогда вы будете использовать полнотекстовые поисковые запросы.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...