PostgreSQL 8.3 如何编写SQL替换字段最后一次出现的括号内容
解决方案
核心逻辑
要匹配最后一次出现的()包裹内容,利用正则贪婪匹配的特性:.*会尽可能匹配最长的字符串,因此可以先捕获到最后一个左括号前的所有内容,再捕获最后一个右括号后的所有内容,拼接后就是移除最后一组括号内容的结果。
正确查询语句
通用写法(适用于MySQL 8.0+、PostgreSQL、Hive、Spark SQL等绝大多数支持regexp_replace的数据库):
SELECT regexp_replace(value, '^(.*)\\([^)]*\\)(.*)$', '$1$2') AS cleaned_value FROM your_table;
如果是使用反斜杠作为捕获组引用的数据库,可以修改为:
SELECT regexp_replace(value, '^(.*)\\([^)]*\\)(.*)$', '\1\2') AS cleaned_value FROM your_table;
原写法错误说明
你之前的写法不符合正则语法规则:
- 正则中匹配任意字符的通配符是
.,*是量词,代表其前面的匹配项可以出现0次或多次,不能单独作为通配符使用 - 转义逻辑混乱,多余的
\*匹配规则和你的需求完全不匹配 - 没有处理捕获和替换的逻辑,自然得不到预期结果
内容的提问来源于stack exchange,提问作者user8383421
相关产品推荐
相关产品推荐

