postgres regex查询以匹配多个字符串模式



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))'

从这里。

最新更新