1

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

例如:

如果我要对violence字符串使用子字符串进行操作'violence begets violence',结果将是'violence begets ' 其他一些示例是

1) 'the fox jumped over the fence'with substringfox不会导致fox字符串末尾没有变化。

2)Can I kick the can带有子字符串can会导致Can I kick the

3)gs_fs_pringles使用子字符串_fs不会导致任何变化

4)gs_pringles_fs带有子字符串_fs会导致gs_pringles

4

2 回答 2

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;
于 2013-05-30T15:19:39.047 回答
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供您使用。

于 2013-05-31T08:23:33.920 回答