我有一个简单的~25个单词列表。我在PostgreSQL中有一个varchar字段,假设列表是['foo', 'bar', 'baz']
。我想在我的表中找到任何包含这些单词的行。这会有效,但我想要更优雅的东西。
select *
from table
where (lower(value) like '%foo%' or lower(value) like '%bar%' or lower(value) like '%baz%')
答案 0 :(得分:186)
PostgreSQL还支持完整POSIX regular expressions:
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。我怀疑正则表达式选项会更快,但任何东西都是工具箱中的有用工具。
答案 1 :(得分:127)
您可以使用支持更改的Postgres'SIMILAR TO
运算符,即
select * from table where lower(value) similar to '%(foo|bar|baz)%';
答案 2 :(得分:5)
实际上在PostgreSQL中有一个运算符:
SELECT *
FROM table
WHERE lower(value) ~~ ANY('{%foo%,%bar%,%baz%}');
答案 3 :(得分:1)
一个'优雅'的解决方案是使用全文搜索:http://www.postgresql.org/docs/9.0/interactive/textsearch.html。然后,您将使用全文搜索查询。
答案 4 :(得分:0)
除LIKE
之外,当前所有受支持的版本(9.5及更高版本)都允许模式匹配。
参考:https://www.postgresql.org/docs/current/functions-matching.html