在T-SQL中,如何仅在字符串(varchar
)的末尾替换子字符串的出现?
例如:
如果我在字符串violence
上使用子字符串'violence begets violence'
进行操作,结果将为'violence begets '
其他一些例子是
1)带有子串'the fox jumped over the fence'
的{{1}}将导致不会发生变化,因为fox
不在字符串的末尾。
2)fox
带有子串Can I kick the can
会导致can
3)带有子串Can I kick the
的{{1}}将导致无变化
4)gs_fs_pringles
带有子串_fs
会导致gs_pringles_fs
答案 0 :(得分:3)
DECLARE @t TABLE(SomeString varchar(100))
INSERT @t VALUES ('violence begets violence'), ('the fox jumped over the fence'), ('Can I kick the can');
WITH CTE1 AS (
SELECT
CHARINDEX(' ', SomeString) AS LeftIndex,
REVERSE(CHARINDEX(' ', SomeString)) AS RightIndex,
RTRIM(SomeString) AS SomeString
FROM
@t
), CTE2 AS (
SELECT
LEFT(SomeString, LeftIndex-1) AS LeftWord,
RIGHT(SomeString, RightIndex-1) AS RightWord,
LeftIndex, RightIndex, SomeString
FROM
CTE1
)
SELECT
CASE
WHEN LeftWord <> RightWord THEN SomeString
ELSE LEFT(SomeString, LEN(SomeString)-RightIndex)
END
FROM
CTE2;
答案 1 :(得分:0)
以下忽略尾随空格。如果这不是问题,请试一试:
SELECT
acolumn = CASE
WHEN LEN(acolumn) < LEN(@substring)
THEN acolumn
ELSE LEFT(acolumn, x.cutpos)
+ REPLACE(SUBSTRING(acolumn, x.cutpos + 1, 999999), @substring, '')
END
FROM atable
CROSS APPLY (SELECT LEN(acolumn) - LEN(@substring)) x (cutpos)
;
查询的工作原理如下:
如果列值的长度小于参数substring的长度,则返回整个列值。
否则,原始值分为两部分:从右侧切出与参数相同的字符数,其余部分形成左侧部分。
如果右边的部分“包含”(但实际上等于)参数,则将其替换为空字符串,否则保持不变。
在任何一种情况下,结果都会连接回原始值的左侧部分,以形成最终的输出值。
你还可以使用SQL Fiddle。