Postgres模式匹配替换列拼写错误时正则匹配失效如何解决
问题原因
- 核心问题是GMC对应的正则规则配置错误:你写的规则
^GMC.+中,+量词要求匹配的字符至少出现1次,也就是说这个规则只能匹配以GMC开头、且后面至少还有1个其他字符的字符串,无法匹配纯GMC本身,所以表A里的GMC记录没有命中规则。 - 你写的UPDATE语句里
name ~* any(array[B.rule])属于冗余写法,不过这个不是导致匹配失败的原因,只是没必要单独把单条rule转为数组再做any匹配。
解决方案
- 先修正表B的正则规则:把
^GMC.+调整为^GMC.*即可,*量词允许前面的匹配项出现0次及以上,既能匹配纯GMC,也能匹配GMC 123这类以GMC开头的其他字符串;如果只需要严格匹配纯GMC,直接把规则改成^GMC$即可。 - 可以优化更新语句,避免冗余写法,同时如果存在一条记录匹配多条规则的情况,建议加排序逻辑指定优先级,避免结果随机,基础示例语句如下:
UPDATE A SET renamed_name = B.correct_name FROM B WHERE A.name ~* B.rule;
如果要指定规则优先级,比如优先匹配更长、更精确的规则,可以用带排序的子查询写法,避免多规则匹配时结果不确定:
UPDATE A SET renamed_name = ( SELECT B.correct_name FROM B WHERE A.name ~* B.rule ORDER BY length(B.rule) DESC LIMIT 1 ) WHERE EXISTS ( SELECT 1 FROM B WHERE A.name ~* B.rule );
内容的提问来源于stack exchange,提问作者Priya Sooraj
相关产品推荐
相关产品推荐

