PostgreSQL带条件与LIKE的UPDATE语句报错排查及替代方案
PostgreSQL UPDATE语句报错原因及修复方案
问题原因
你写的SUBSTRING(name_1 FROM '%(%' FOR ')')存在两个核心问题:
- 在PostgreSQL中,
SUBSTRING(string FROM pattern)语法里的pattern会被解析为正则表达式,你写的%(%中的左括号未转义,正则引擎认为括号不匹配,触发invalid regular expression: parentheses () not balanced错误。 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
相关产品推荐
相关产品推荐

