SQL如何解析带重复数字分隔段的字符串以提取目标输出列值
SQL处理带重复数字后缀字符串的实现方案
核心处理逻辑
要批量处理#CHAR表中value列的字符串,提取前置有效文本、去掉所有末尾连续的 - 数字格式后缀,不需要手动逐次从右向左定位分隔符,直接通过正则规则匹配字符串尾部的目标结构批量替换即可。
匹配规则为:锚定字符串末尾位置,匹配1个及以上连续出现的「空格+短横+空格+纯数字」结构,将匹配到的后缀内容替换为空。未匹配到该规则的纯文本字符串不会做任何修改,完全符合需求。
各常用数据库的实现代码
MySQL 8.0+
内置正则替换函数直接调用,注意正则表达式中的反斜杠需要做转义处理:
UPDATE #CHAR SET output = REGEXP_REPLACE(value, '( - \\d+)+$', '');
PostgreSQL
正则表达式无需重复转义反斜杠,直接传入规则即可:
UPDATE #CHAR SET output = REGEXP_REPLACE(value, '( - \d+)+$', '', 'g');
SQL Server 2017+
同样需要对正则中的反斜杠做转义:
UPDATE #CHAR SET output = REGEXP_REPLACE(value, '( - \\d+)+$', '');
Hive/Spark SQL(数仓场景)
UPDATE #CHAR SET output = regexp_replace(value, '( - \d+)+$', '');
效果校验示例
实际处理结果完全匹配预期:
- 输入:
销售数据汇总 - 1 - 4→ 输出:销售数据汇总- 输入:
无后缀的纯文本内容→ 输出:无后缀的纯文本内容- 输入:
用户分层标签 - 216→ 输出:用户分层标签- 输入:
项目里程碑 - Q2 - 18→ 输出:项目里程碑 - Q2
方案注意事项
如果采用传统的从右向左逐位查找分隔符的实现,很容易出现两个问题:
- 碰到正文内容本身包含
- 数字结构的场景,容易误截断有效文本 - 遇到多段重复后缀的场景,需要编写循环逻辑判断截止位置,代码冗长且效率低
上述正则实现只会匹配字符串最末尾连续的符合规则的后缀,不会误伤正文中间的同结构内容,边界兼容性更好。
内容的提问来源于stack exchange,提问作者Shantanu
相关产品推荐
相关产品推荐

