You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.28 19:06:25