我有一个大约25个单词的简单列表。我在PostgreSQL中有一个varchar字段,假设列表是['foo', 'bar', 'baz']。我要找到表中包含这些词的行。这个可以,但我想要更优雅的。

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

一个“优雅”的解决方案是使用全文搜索:http://www.postgresql.org/docs/9.0/interactive/textsearch.html。然后使用全文搜索查询。


你可以使用Postgres的SIMILAR TO操作符,它支持替换。

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

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用于产生布尔值的任何运算符。我怀疑正则表达式选项会更快,但ANY是一个有用的工具,在您的工具箱中。


实际上在PostgreSQL中有一个运算符:

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

目前支持的所有版本(9.5及以上)除了LIKE之外还允许模式匹配。

参考:https://www.postgresql.org/docs/current/functions-matching.html