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

chm*_*lig 140 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%')
Run Code Online (Sandbox Code Playgroud)

mu *_*ort 208

PostgreSQL还支持完整的POSIX正则表达式:

select * from table where value ~* 'foo|bar|baz';
Run Code Online (Sandbox Code Playgroud)

~*是不区分大小写的匹配,~是区分大小写的.

另一种选择是使用ANY:

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

您可以对任何产生布尔值的运算符使用ANY.我怀疑正则表达式选项会更快,但任何东西都是你工具箱中的有用工具.


Nor*_*ame 143

您可以使用SIMILAR TO支持更改的Postgres' 运算符,即

select * from table where lower(value) similar to '%(foo|bar|baz)%';
Run Code Online (Sandbox Code Playgroud)

  • 根据http://dba.stackexchange.com/a/10696/27757,`SIMILAR TO`在内部翻译为正则表达式搜索 (3认同)
  • 正则表达式可能会加快速度:http://dba.stackexchange.com/questions/10694/pattern-matching-with-like-similar-to-or-regular-expressions-in-postgresql (2认同)

jla*_*rcy 12

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

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

  • ~~只是like的另一个名字:[“运算符~~相当于LIKE,而~~ *相当于ILIKE。还有~~~和` !~~ *`运算符分别表示“不喜欢”和“不喜欢”。所有这些运算符都是PostgreSQL特定的。“](https://www.postgresql.org/docs/current/static/functions- matching.html#FUNCTIONS-LIKE)。并且'{%foo%,%bar%,%baz%}'是`array ['%foo%','%bar%','%baz%']`的文本形式。 (5认同)
  • 那么 *ilike* 可以以同样的方式与 *any* & array 一起使用吗?如果不需要花哨的正则表达式,这看起来很干净。或者它会在内部被翻译成正则表达式吗? (2认同)