TSQL如何实现字符串每隔2个字符替换1个字符为“.”的功能
TSQL 每隔2个字符替换为“.”的实现方案
方案1:嵌套STUFF函数(适合最长50字符的场景)
你待处理的字符串最长仅50个字符,需要替换的位置为3、5、7...49,最多24层嵌套,直接嵌套STUFF即可实现叠加替换效果,逻辑简单易维护:
-- 示例:处理字符串'abcdefghi' SELECT STUFF( STUFF( STUFF( STUFF('abcdefghi', 3, 1, '.'), 5, 1, '.'), 7, 1, '.'), 9, 1, '.') AS result
如果要兼容最长50字符的所有情况,补全后续STUFF嵌套即可,超出字符串实际长度的STUFF操作不会报错,会直接返回原字符串。
方案2:递归CTE实现(通用任意长度场景)
如果不想手动写多层嵌套,可使用递归CTE自动遍历所有需要替换的位置,适配任意长度的输入字符串:
DECLARE @inputStr VARCHAR(50) = 'abcdefghi'; WITH RecurReplace AS ( -- 初始状态:待替换位置从3开始 SELECT @inputStr AS str, 3 AS pos UNION ALL -- 递归替换:每次替换当前位置的字符,位置+2,直到超过字符串长度 SELECT STUFF(str, pos, 1, '.'), pos + 2 FROM RecurReplace WHERE pos <= LEN(str) ) -- 取递归最后一轮的结果 SELECT TOP 1 str AS result FROM RecurReplace ORDER BY pos DESC
逻辑说明
- 递归初始锚点定义原始字符串和第一个要替换的位置3
- 每次递归调用对当前位置执行替换,位置向后偏移2位
- 当位置超过字符串总长度时停止递归
- 最后取位置最大的那一条记录,就是全部替换完成的结果
两种方案测试输入abcdefghi时,输出均为ab.de.gh.,符合预期。
内容的提问来源于stack exchange,提问作者neotrojan
相关产品推荐
相关产品推荐

