在SQL中的字符串末尾专门替换子字符串

时间:2013-05-30 15:12:04

标签: sql sql-server-2008-r2

在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

2 个答案:

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

查询的工作原理如下:

  1. 如果列值的长度小于参数substring的长度,则返回整个列值。

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

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

  4. 在任何一种情况下,结果都会连接回原始值的左侧部分,以形成最终的输出值。

  5. 你还可以使用SQL Fiddle