我有一列包含作者数组。如何使用~*
运算符检查其任何值是否与给定的正则表达式匹配?~*
运算符在左边检查字符串,在右边匹配正则表达式。文档说ANY
运算符必须在右侧,因此,显然
SELECT '^p' ~* ANY(authors) FROM book;
不起作用,因为PostgreSQL尝试将字符串
^p
与数组中包含的表达式匹配。任何想法?
最佳答案
第一个显而易见的想法是将自己的regexp-matching运算符与经过转换的参数一起使用:
create function commuted_regexp_match(text,text) returns bool as
'select $2 ~* $1;'
language sql;
create operator ~!@# (
procedure=commuted_regexp_match(text,text),
leftarg=text, rightarg=text
);
然后,您可以像这样使用它:
SELECT '^p' ~!@# ANY(authors) FROM book;
查看它的另一种不同方法是取消嵌套该数组并在SQL中将其表示为ANY构造的等效形式:
select bool_or(r) from
(select author ~* '^j' as r
from (select unnest(authors) as author from book) s1
) s2;
关于regex - 如何通过ANY数组运算符使用正则表达式,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/22098706/