postgres查询选择具有name
列的elements
,该列包含数组中的任何字符串:
select "elements".* from "elements" where "elements"."name" ~* 'hap|bir'
这很有效。
现在,只有当列包含数组中的每个字符串(没有特定顺序(时,才选择元素的regex模式是什么?
您的查询使用数组生成与以下非正则表达式LIKE
相同的结果
SELECT *
FROM elements
WHERE lower(name) LIKE ANY(ARRAY['%hap%', '%bir%']);
因此,要仅在列包含数组的每个字符串时从元素中进行选择,请将其从ANY
更改为ALL
SELECT *
FROM elements
WHERE lower(name) LIKE ALL(ARRAY['%hap%', '%bir%']);
演示
你猜怎么着,你实际上可以将regexp匹配运算符与数组上的ALL
结合起来。
SELECT *
FROM elements
WHERE name ~* ALL(ARRAY['mhapM', 'mbirM'])
如果搜索文本不是单个字段,而是多个字段的串联,则这可能特别有利。
(注:m
是单词的开头,M
是单词的结尾。(
这里有一个正则表达式模式,用于仅当列包含数组的每个字符串(没有特定顺序(时选择elements
:
select "elements".* from "elements" where "elements"."name" ~* '(?=.*?(hap))(?=.*?(bir))'
从这里。