PostgreSQL通配符LIKE用于任何单词列表

时间:2011-02-07 23:43:29

标签: sql postgresql

我有一个简单的~25个单词列表。我在PostgreSQL中有一个varchar字段,假设列表是['foo', 'bar', 'baz']。我想在我的表中找到任何包含这些单词的行。这会有效,但我想要更优雅的东西。

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

5 个答案:

答案 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