regex 使用正则表达式模式中的字段值匹配PostgreSQL中的另一个字段

n3h0vuf2  于 2023-11-20  发布在  PostgreSQL
关注(0)|答案(1)|浏览(224)

我试图在PostgreSQL中将ILIKE匹配修改为~* 匹配,但我碰壁了。目标是使用第二个字段作为第一个字段的子字符串将一个字段匹配到另一个字段。这是原始查询:

select a.col1,b.col2 from a,b where a.col1 ilike ('%' || b.col2 || '%')

字符串
这很好,但我需要添加一些东西,如空格或字符串子句的开头,以避免太多的匹配。但是,当我尝试:

select a.col1,b.col2 from a,b where a.col1 ~* ('^| ' || b.col2 || '$| ')


我得到错误“invalid regular expression:parentals()not balanced”。我假设我在查询中做错了什么,或者b字段中有需要转义的字符。如果确实是这个问题,我认为开始清理该字段是不切实际的。
是否有一种方法可以指定字段应该按字面意思阅读,类似于Python中字符串的'r'前缀?或者我忽略了另一个问题?

ryoqjall

ryoqjall1#

PostgreSQL中没有一个函数可以像Python中的r那样工作。如果你想把它用作正则表达式,你必须从第二列的文本中转义括号,否则它将是无效的。你可以写一个函数

CREATE OR REPLACE FUNCTION escape_parentheses(text) RETURNS text AS $$
BEGIN
  RETURN regexp_replace($1, '([()])', '\\\1', 'g');
END;
$$ LANGUAGE plpgsql;

字符串
然后您的查询变成

select a.col1,b.col2 from a,b where a.col1 ~* (' ' || escape_parentheses(b.col2) || ' ')


我不知道你为什么要在正则表达式中添加|,它的作用是交替,所以它会像^一样匹配所有的内容。
| a.col1个|b.col2个|
| --|--|
| 这是一个测试字符串。|测试|
| 另一个字符串示例|例如|
| 要检查的一些随机文本。|随机|
| 这里没有匹配项。|无匹配|
| | (par |
| | par) |
| | (par) |

结果

| col1| col2|
| --|--|
| 这是一个测试字符串。|测试|
| 另一个字符串示例|例如|
| 要检查的一些随机文本。|随机|
P.S. quote_literal不起作用,并且E只能用于字符串文字

相关问题