所以我的问题是我需要替换字符串中的特定字符,而不是第一次出现此字符。 例如:- 列中的字符串可以看起来像以下任何一种形式:
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函数,但只能找出如何替换所有下划线。
答案 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