You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

PostgreSQL带条件与LIKE的UPDATE语句报错排查及替代方案

PostgreSQL UPDATE语句报错原因及修复方案

问题原因

你写的SUBSTRING(name_1 FROM '%(%' FOR ')')存在两个核心问题:

  1. 在PostgreSQL中,SUBSTRING(string FROM pattern)语法里的pattern会被解析为正则表达式,你写的%(%中的左括号未转义,正则引擎认为括号不匹配,触发invalid regular expression: parentheses () not balanced错误。
  2. FOR子句在这里的用法错误,它是SQL标准中用于指定转义字符的参数,不是用来定义截取结束符的。

修复后的实现方式

方式一:使用正则表达式捕获组(简洁高效)

利用正则的捕获组直接提取括号内内容,同时用~操作符判断是否包含括号:

UPDATE table_1
SET name_3 = 
    CASE
        WHEN COALESCE(name_3, '') <> '' THEN name_3 -- 兼容NULL和空字符串情况
        WHEN name_1 ~ '\(' THEN SUBSTRING(name_1 FROM '\((.*?)\)') -- 非贪婪匹配括号内内容
        ELSE name_1
    END
WHERE status IN ('down', 'error');
  • \(和\)是转义后的括号,避免正则语法冲突;
  • (.*?)是非贪婪匹配,确保只提取第一对括号内的内容;
  • COALESCE(name_3, '')处理name_3为NULL的情况,避免判断失效。

方式二:使用字符串位置函数(无正则依赖)

如果不想用正则,可以用strpos定位括号位置,再截取内容:

UPDATE table_1
SET name_3 = 
    CASE
        WHEN COALESCE(name_3, '') <> '' THEN name_3
        WHEN strpos(name_1, '(') > 0 AND strpos(name_1, ')') > strpos(name_1, '(') 
            THEN SUBSTRING(name_1 FROM strpos(name_1, '(') + 1 FOR strpos(name_1, ')') - strpos(name_1, '(') - 1)
        ELSE name_1
    END
WHERE status IN ('down', 'error');
  • strpos(name_1, '(')获取左括号的位置,strpos(name_1, ')')获取右括号位置;
  • 额外判断右括号在左括号之后,避免无效截取。

内容的提问来源于stack exchange,提问作者user20881617

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.05 05:55:30