我有一列包含作者数组。如何使用~*运算符检查其任何值是否与给定的正则表达式匹配?
~*运算符在左边检查字符串,在右边匹配正则表达式。文档说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/

10-09 20:19
查看更多