我有一个大约25个单词的简单列表。我在PostgreSQL中有一个varchar字段,假设列表是['foo', 'bar', 'baz']。我要找到表中包含这些词的行。这个可以,但我想要更优雅的。
select *
from table
where (lower(value) like '%foo%' or lower(value) like '%bar%' or lower(value) like '%baz%')
我有一个大约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