postgres正则表达式查询以匹配多个字符串模式

时间:2018-11-21 22:50:45

标签: regex postgresql

postgres查询选择elements,其中的name列包含来自数组的任意字符串:

select "elements".* from "elements" where "elements"."name" ~* 'hap|bir'

这很好。

现在, 仅当列包含数组的每个字符串(无特定顺序)时,用于选择元素的正则表达式模式是什么?

3 个答案:

答案 0 :(得分:1)

您的查询使用数组产生与以下非正则表达式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%']);

Demo

答案 1 :(得分:0)

这里是一个正则表达式模式,仅当列包含数组的每个字符串(不按特定顺序)时,才选择elements

select "elements".* from "elements" where "elements"."name" ~* '(?=.*?(hap))(?=.*?(bir))'

来自here

答案 2 :(得分:0)

猜猜是什么,您实际上可以将regexp匹配运算符与ALL组合在一起用于数组。

SELECT * 
  FROM elements 
WHERE name ~* ALL(ARRAY['\mhap\M', '\mbir\M'])

如果您的搜索文本不是单个字段,而是多个字段的串联,则这可能特别有利。

(注意:\m是单词的开头,\M是单词的结尾。)