SQL Server 2014如何批量替换字符串中所有3字符加横杠的前缀内容
解决SQL Server 2014批量删除所有「3个字符+横杠」格式内容的方案
由于SQL Server 2014不支持正则替换,也没有高版本的TRANSLATE/REGEXP_REPLACE函数,我们可以通过递归CTE + 通配符匹配 + 字符串裁剪的方式实现全量替换,兼容你现有的测试表结构,完整可运行代码如下:
WITH RecursiveReplace AS ( -- 锚点:初始化原始数据,查找第一个匹配项的位置 SELECT someValue AS originalValue, someValue AS currentValue, -- 通配符规则可按需调整: -- 匹配任意3字符+横杠用 '%___-%' -- 仅匹配3个英文字母+横杠用 '%[a-zA-Z][a-zA-Z][a-zA-Z]-%' PATINDEX('%[a-zA-Z][a-zA-Z][a-zA-Z]-%', someValue) AS matchPos FROM String_Removal_Example UNION ALL -- 递归:每次删除1个匹配项,继续查找下一个 SELECT originalValue, STUFF(currentValue, matchPos, 4, ''), PATINDEX('%[a-zA-Z][a-zA-Z][a-zA-Z]-%', STUFF(currentValue, matchPos, 4, '')) FROM RecursiveReplace WHERE matchPos > 0 ) -- 取递归结束后无匹配项的最终结果 SELECT originalValue, currentValue AS cleanedValue FROM RecursiveReplace WHERE matchPos = 0 -- 递归深度默认100,单条字符串最长匹配数不超过100可不用修改 OPTION (MAXRECURSION 100);
代码说明
PATINDEX支持通配符匹配,会返回第一个符合规则的子串起始位置,不存在匹配则返回0STUFF函数直接裁剪掉从匹配位置开始的4个字符(3个匹配字符+1个横杠)- 递归会循环执行替换逻辑,直到整条字符串没有符合规则的内容为止
测试结果
针对你提供的测试数据,输出结果如下:
| originalValue | cleanedValue |
|---|---|
| abc-123 | 123 |
| abc-123 ABC-123 | 123 123 |
| abc-123 ABc-123 123-ABC DEF-123 | 123 123 123-ABC 123 |
如果你需要删除所有3个任意字符+横杠的内容(包含数字开头的123-),只需把PATINDEX的通配符规则改为%___-%即可,第三行的输出会变为123 123 ABC 123,完全符合你的需求示例。
内容的提问来源于stack exchange,提问作者Theo
相关产品推荐
相关产品推荐

