T-SQL如何替换指定位置空格 仅移除B标识与日期间多余空格
问题说明
现有字符类型列Test,单条示例数据如下:
A:Hi B: 13/06/2022 C:Peter
原有实现逻辑是通过string_split()按空格拆分,提取标识B对应的内容,测试代码写法为:
declare @test varchar(100) = replace('A:Hi C:Peter B: 13/06/2022',' ','') select * from string_split(@test,' ') where [value] like 'B%'
上述代码全局替换了所有空格,导致所有字段内容粘连,执行结果为:
A:HiB:13/06/2022C:Peter
预期效果为仅移除B标识与对应日期值之间的空格,其余位置的空格保留,处理后字符串效果为:
A:Hi B:13/06/2022 C:Peter
此前尝试全局REPLACE、LTRIM、RTRIM函数均无法满足精准移除指定位置空格的需求。
解决方案
核心逻辑是放弃全局替换空格的思路,仅针对B:后紧邻的空格做定向删除,不触碰其他位置的正常分隔空格。
- 固定单空格场景(最简洁实现)
如果B:和日期值之间固定只有1个空格,直接定向替换目标子串即可,代码如下:
DECLARE @test VARCHAR(100) = 'A:Hi C:Peter B: 13/06/2022' -- 仅替换B:后紧跟的单个空格,其余空格完全保留 SET @test = REPLACE(@test, 'B: ', 'B:') -- 此时再按空格拆分即可正常提取B对应内容 SELECT value FROM string_split(@test, ' ') WHERE value LIKE 'B%'
执行后字符串处理结果完全符合预期,拆分后可直接拿到B:13/06/2022的目标值。
- 多不定长空格兼容场景
如果B:和日期之间可能存在1个以上的连续空格,可通过PATINDEX定位目标位置循环删除紧邻空格,代码如下:
DECLARE @test VARCHAR(100) = 'A:Hi C:Peter B: 13/06/2022' DECLARE @bIndex INT = PATINDEX('%B: %', @test) -- 循环删除B:后所有连续紧邻空格 WHILE @bIndex > 0 BEGIN SET @test = STUFF(@test, @bIndex + 2, 1, '') SET @bIndex = PATINDEX('%B: %', @test) END -- 输出处理完成的字符串 SELECT @test AS ProcessedResult
该写法会自动清理B:后所有连续的前置空格,不会影响A、C标识前后的分隔空格,适配更灵活的脏数据场景。
内容的提问来源于stack exchange,提问作者VB.netDeveloper
相关产品推荐
相关产品推荐

