2013-05-30 73 views
0

在T-SQL中,如何仅在字符串末尾替换子字符串的出现(varchar)?在SQL中的字符串末尾专门替换子字符串

例如:

如果我是对字符串'violence begets violence'violence的运做,其结果必然是'violence begets ' 一些其他的例子是

1)'the fox jumped over the fence'与子fox会导致无更改为fox不在字符串的末尾。

2)Can I kick the can以substring can将导致Can I kick the

3)gs_fs_pringles以substring _fs将导致不可更改

4)gs_pringles_fs以substring _fs将导致gs_pringles

+0

请问您可以添加更多样品吗? – gbn

+1

为什么'gs_pringles_fs'变成'gs_pringles'? 'gs'不是'fs'? – gbn

+0

因为替换字符串是_fs –

回答

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; 
+0

对不起。它靠得很近,但对于'狐狸跳过篱笆'并没有效果。 它截断了原始字符串 –

+0

:(。没有单行答案?我想能够在另一个查询中使用它。 –

+0

@JayJayJay:你可以,但它变得非常混乱。 ... – gbn

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) 
; 

查询是这样的:

  1. 如果列值的长度小于参数字符串的长度,整个列值被返回。

  2. 否则,将原始值分成两部分:从右侧切出与参数中相同数量的字符,剩余部分形成左侧部分。

  3. 如果右边部分“包含”(但实际上等于)参数,则它被替换为空字符串,否则它保持不变。

  4. 在任一事件中,结果都连接回原始值的左侧部分以形成最终输出值。

还有一个SQL Fiddle让你玩。

+0

漂亮的sql提琴 –

+0

什么是cutpos? –

+1

'cutpos'是由'CROSS APPLY'条款生成的一列。它是列值的长度和参数的长度之间的差异。如果你确实需要一个表达式,你可以删除CROSS APPLY子句,并用'LEN(acolumn) - LEN(@substring)'替换每个'x.cutpos'条目。这会给你相同的结果。 –