У меня есть простой список ~ 25 слов. У меня есть поле varchar в PostgreSQL, скажем, список есть ['foo', 'bar', 'baz']
. Я хочу найти в моей таблице любую строку, в которой есть любое из этих слов. Это будет работать, но я хотел бы что-то более элегантное.
select *
from table
where (lower(value) like '%foo%' or lower(value) like '%bar%' or lower(value) like '%baz%')
sql
postgresql
chmullig
источник
источник
SIMILAR TO
внутренне переведен на поиск регулярных выраженийlower()
неэффективно, потому что сначала оно преобразует каждую строку в нижний регистр, что обходится дороже, чем сопоставлениеPostgreSQL также поддерживает полные регулярные выражения POSIX :
Для
~*
сопоставления без учета регистра, с~
учетом регистра.Другой вариант - использовать ЛЮБОЙ :
Вы можете использовать ЛЮБОЙ с любым оператором, который выдает логическое значение. Я подозреваю, что параметры регулярного выражения будут быстрее, но ЛЮБОЙ это полезный инструмент, который есть в вашем наборе инструментов.
источник
Для этого в PostgreSQL есть оператор:
источник
~~
это просто другое название дляlike
: «Оператор~~
эквивалентенLIKE
, и~~*
соответствуетILIKE
. Есть также!~~
и!~~*
операторы, которые представляютNOT LIKE
иNOT ILIKE
, соответственно. Все эти операторы специфичны для PostgreSQL». , И'{%foo%,%bar%,%baz%}'
текстовая формаarray['%foo%', '%bar%', '%baz%']
.SIMILAR TO
преобразовывает в Регулярное выражение,~
оператор обозначает Регулярное выражение POSIX, но это не ясноLIKE
.Одним из «элегантных» решений было бы использование полнотекстового поиска: http://www.postgresql.org/docs/9.0/interactive/textsearch.html . Тогда вы будете использовать полнотекстовые поисковые запросы.
источник