MSSQL在特定字符后替换字符串中的特定字符

时间:2016-02-10 14:24:47

标签: sql-server sql-server-2008-r2

所以我的问题是我需要替换字符串中的特定字符,而不是第一次出现此字符。 例如:- 列中的字符串可以看起来像以下任何一种形式:

1234,
ab_12,
ab_12_34,
ab_12_34_5,
abc_12,
abc_12_34,
abc_12_34_5,

我需要的结果是

1234,
ab_12,
ab_12 34,
ab-12 34 5,
abc_12,
abc_12 34,
abc_12 34 5,

所以基本上每个得分都用空格代替。 我使用了Replace函数,但只能找出如何替换所有下划线。

4 个答案:

答案 0 :(得分:0)

编写它会很难看,但是使用CharIndex()来获取第一个下划线的位置,然后在第一个下划线后面的子串上使用Replace()函数,并将其连接到SubString(),直到并包括第一个下划线。

答案 1 :(得分:0)

您可以使用CHARINDEX来确定_VARCHAR是否至少发生过LEFT次。如果是这种情况,您可以将字符串的_部分带到第一个_,然后在替换 DECLARE @test VARCHAR(50)= 'ab_12_34_5' SELECT CASE WHEN CHARINDEX('_', @test, 0) > 0 AND CHARINDEX('_',@test, CHARINDEX('_', @test, 0) + 1) > 0 THEN LEFT(@test, CHARINDEX('_', @test, CHARINDEX('_', @test, 0) + 1)- 1) + REPLACE(SUBSTRING(@test, CHARINDEX('_', @test, CHARINDEX('_', @test, 0) + 1),LEN(@test)), '_', ' ') ELSE @test END 字符后连接字符串的其余部分:

{{1}}

答案 2 :(得分:0)

charindex, substrubg & left函数的另一个答案:

DECLARE @t TABLE (val varchar(255));
INSERT INTO @t 
VALUES ('1234'),
    ('ab_12'),
    ('ab_12_34'),
    ('ab_12_34_5'),
    ('abc_12'),
    ('abc_12_34'),
    ('abc_12_34_5');

SELECT val
    ,(
        LEFT(val, CHARINDEX('_',val,1))
        + REPLACE(SUBSTRING(val, CHARINDEX('_',val, 1) + 1, LEN(val)), '_', ' ')
      ) as v2

FROM @t;

答案 3 :(得分:0)

也许这会有效,我已经用你的样本数据进行了测试:

CREATE TABLE #Temp ( val VARCHAR(20) )

INSERT  INTO #Temp
        ( val )
VALUES  ( '1234,' ),
        ( 'ab_12,' ),
        ( 'ab_12_34,' ),
        ( 'ab_12_34_5,' ),
        ( 'abc_12,' ),
        ( 'abc_12_34,' ),
        ( 'abc_12_34_5,' )

SELECT  val ,
        CHARINDEX('_', val, 1) AS FirstChar ,
        LEN(val) AS Length ,
        LEFT(val, CHARINDEX('_', val, 1)) AS LeftPart ,
        REPLACE(SUBSTRING(val, 
                          CHARINDEX('_', val, 1) + 1, 
                          LEN(val) - CHARINDEX('_', val, 1)), '_', ' ') AS Remainder ,
        LEFT(val, CHARINDEX('_', val, 1)) 
      + REPLACE(SUBSTRING(val, 
                          CHARINDEX('_', val, 1) + 1, 
                          LEN(val)- CHARINDEX('_', val, 1)), '_', ' ') Formatted
FROM    #Temp

DROP TABLE #Temp