首页 > 解决方案 > TSQL - 在一个字符串中,每 2 个字符用一个固定的字符替换一个字符

问题描述

我不能用“。”替换字符串的每 2 个字符。

选择 STUFF('abcdefghi', 3, 1, '.') c3,STUFF('abcdefghi', 5, 1, '.') c5,STUFF('abcdefghi', 7, 1, '.') c7,STUFF ('abcdefghi', 9, 1, '.') c9

如果我使用 STUFF,我应该随后将字符串 c3、c5、c7 和 c9 重叠。但我找不到方法

你能帮助我吗?

初始字符串:

abcdefghi

我想要的结果是

ab.de.gh.

字符串最多可包含 50 个字符

标签: tsqloverlap

解决方案


创建一个 numbers/tally/digits 表,如果您还没有,那么您可以使用它来定位每个字符位置:

with digits as ( /* This would be a real table, here it's just to test */
    select n from (values(1),(2),(3),(4),(5),(6),(7),(8),(9),(10))x(n)
), t as (
    select 'abcdefghi' as s
)
select String_Agg( case when d.n%3 = 0 then '.' else Substring(t.s, d.n, 1) end, '')
from t
cross apply digits d
where d.n <Len(t.s)

for xml与现有表一起使用

with digits as (
    select n from (values(1),(2),(3),(4),(5),(6),(7),(8),(9),(10))x(n)
),
r as (
    select t.id, case when d.n%3=0 then '.' else Substring(t.s, d.n, 1) end ch
    from t
    cross apply digits d
    where d.n <Len(t.s)
)
select result=(select '' + ch
    from r r2
    where r2.id=r.id
    for xml path('')
)
from r
group by r.id

推荐阅读