Подстановочный знак PostgreSQL как для любого из списка слов



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



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

4 ответов:

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

select * from table where lower(value) similar to '%(foo|bar|baz)%';

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

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

The ~* для совпадения без учета регистра,~ регистр.

другой вариант-использовать любой:

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

вы можете использовать любой с любым оператором, который дает логическое значение. Я подозреваю, что параметры регулярных выражений будут быстрее, но любой из них является полезным инструментом в вашем наборе инструментов.

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

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

SELECT *
FROM table
WHERE lower(value) ~~ ANY('{%foo%,%bar%,%baz%}');

Comments

    Ничего не найдено.