替换部分字符串而不替换/填充

时间:2017-06-14 14:25:42

标签: sql-server string replace

这是我的字符串:11.0000.0101.000.000.0101.000.000

我需要将第一个“0101”替换为“101”。我不能使用replace,因为它也取代了0101的第二个实例。

我试过

stuff(string, 9, 3, '101')

但是由于替换字符串比现有字符串短,我最终得到

11.0000.1011.000.000.0101.000.000

除了REPLACE或STUFF,我还能使用什么?谢谢!

5 个答案:

答案 0 :(得分:1)

    declare @t table(s varchar(100))
    insert into  @t values
    ( '11.0000.0101.000.000.0101.000.000'), ('abc');

    select case charindex('0101', s) 
                when 0 then s
                else stuff(s, charindex('0101', s), 4, '101')
           end as new_s      
    from @t;

答案 1 :(得分:1)

你的表情几乎是正确的。

告诉它替换原始字符串的4个字符而不是3:

stuff(string, 9, 4, '101')

但是只有当你的字符串总是在相同的位置时,这才有效。

答案 2 :(得分:0)

你可以这样做:

replace (stuff(string,9,3,'#101'),'#','')

答案 3 :(得分:0)

如果您需要将所有0101替换为101,请使用以下代码

 DECLARE @TempData TABLE(Data VARCHAR(1000));
    INSERT INTO @TempData VALUES
        ('11.0000.0101.000.000.0101.000.000');

    ;WITH Cte
    AS (
        SELECT CASE 
                WHEN DATA = '0101'
                    THEN '101'
                ELSE CAST(DATA AS VARCHAR(10))
                END AS DATA
        FROM (
            SELECT Split.a.value('.', 'VARCHAR(1000)') AS Data
            FROM (
                SELECT CAST('<S>' + REPLACE(Data, '.', '</S><S>') + '</S>' AS XML) AS Data
                FROM @TempData
                ) AS A
            CROSS APPLY Data.nodes('/S') AS Split(a)
            ) Dt
        )
    SELECT STUFF((
                SELECT '.' + DATA
                FROM cte
                FOR XML PATH('')
                ), 1, 1, '') AS ExpectedResult

输出

ExpectedResult
11.0000.101.000.000.101.000.000

答案 4 :(得分:0)

如果您不了解第一次观察,还有另一种选择

https://api.library.com/:entity/

返回

Declare @S varchar(50) = '11.0000.0101.000.000.0101.000.000'
Declare @Find varchar(25) = '0101'
Declare @Repl varchar(25) = '101'


Select isnull(stuff(@S, charindex(@Find,@S), len(@Find), @Repl),@S)