SQL Server如何删除符合「_+12个字符」模式的子串
问题原因
SQL Server 原生的PATINDEX函数不支持标准正则表达式的\S、{n}这类语法,同时如果你要匹配字面量下划线,必须将其放在方括号[]中转义,否则下划线会被识别为「匹配任意单个字符」的通配符,这就是你之前的写法匹配不到结果的原因。
实现方案
单处匹配场景(多数场景)
如果你的数据里每一行最多只有一处符合「下划线+12个字符」规则的子串,直接用PATINDEX搭配STUFF函数即可实现:
SELECT CASE -- 匹配规则:字面量下划线 + 12个任意字符 WHEN PATINDEX('%[_]____________%', myCol) > 0 -- 从匹配位置开始删除13个字符(下划线+12个目标字符) THEN STUFF(myCol, PATINDEX('%[_]____________%', myCol), 13, '') ELSE myCol END AS processed_col FROM your_table
如果需要严格限定要删除的12个字符中不包含下划线,避免误删,可以把匹配规则改成:PATINDEX('%[_][^_][^_][^_][^_][^_][^_][^_][^_][^_][^_][^_][^_]%', myCol)
这里的[^_]表示匹配任意非下划线的单个字符。
多处匹配场景
如果一行数据里存在多处符合规则的子串,可以循环执行UPDATE语句直到没有匹配项为止:
WHILE 1=1 BEGIN UPDATE your_table SET myCol = STUFF(myCol, PATINDEX('%[_]____________%', myCol), 13, '') WHERE PATINDEX('%[_]____________%', myCol) > 0 IF @@ROWCOUNT = 0 BREAK END
效果验证
- 示例1:输入
Winter_QZ6P91712017_115BPM,处理后输出Winter_115BPM - 示例2:输入
cpx_Note In My Calendar_QZ6P91707044,处理后输出cpx_Note In My Calendar
内容的提问来源于stack exchange,提问作者Marco Ferrè
相关产品推荐
相关产品推荐

