微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

如何在 CTE 中限制 STUFF 函数以在重复单词之前删除字符

如何解决如何在 CTE 中限制 STUFF 函数以在重复单词之前删除字符

Replace a recurring word and the character before it 的后续问题

感谢@Larnu 对于以下代码,如果在重复出现的单词“[BACKSPACE]”之前不再有字符,将如何修改代码以不产生空值。我相信出现空值是因为当重复出现的 [BACKSPACE] 词之前不再有字符时,CHARINDEX() 函数会产生一个负值。该解决方案需要与 sql Server 2008 兼容。

最终目标是任何有[BACKSPACE]的地方,如果[BACKSPACE]之前有字符,则删除它;否则,不要尝试删除之前的字符。

DECLARE @inputString NVARCHAR(MAX);

SET @inputString = 'Word[BACKSPACE][BACKSPACE][BACKSPACE][BACKSPACE][BACKSPACE]sgred[BACKSPACE][BACKSPACE][BACKSPACE][BACKSPACE][BACKSPACE][BACKSPACE][BACKSPACE]SecondWord';

WITH rCTE AS(
    SELECT V.YourColumn,STUFF(V.YourColumn,CHARINDEX('[BACKSPACE]',V.YourColumn)-1,LEN('[BACKSPACE]')+1,'') AS ReplacedColumn,1 AS Iteration
    FROM (VALUES(@inputString))V(YourColumn)
    UNION ALL
    SELECT r.YourColumn,STUFF(r.ReplacedColumn,r.ReplacedColumn)-1,''),r.Iteration + 1
    FROM rCTE r
    WHERE CHARINDEX('[BACKSPACE]',r.ReplacedColumn) > 0)
SELECT TOP (1) WITH TIES
       r.YourColumn,r.ReplacedColumn
FROM rCTE r
ORDER BY ROW_NUMBER() OVER (PARTITION BY r.YourColumn ORDER BY r.Iteration DESC);

所需的输出'SecondWord'

解决方法

您需要检查 CASE 是否在字符串的开头,在这种情况下,您不需要之前的位置,因为它是 0。>

我将对这段代码进行一些其他改进:LEN 可以计算一次,我们也可以将 [BACKSPACE] 值存储在一个变量中

DECLARE @inputString NVARCHAR(MAX);

SET @inputString = 'Word[BACKSPACE][BACKSPACE][BACKSPACE][BACKSPACE][BACKSPACE]sgred[BACKSPACE][BACKSPACE][BACKSPACE][BACKSPACE][BACKSPACE][BACKSPACE][BACKSPACE]SecondWord';

DECLARE @bspace nvarchar(50) = '[BACKSPACE]';
DECLARE @len int = LEN(@bspace);

WITH rCTE AS(
    SELECT V.YourColumn,STUFF(V.YourColumn,CHARINDEX(@bspace,V.YourColumn)-1,@len+1,'') AS ReplacedColumn,1 AS Iteration
    FROM (VALUES(@inputString))V(YourColumn)
    UNION ALL
    SELECT r.YourColumn,CASE WHEN CHARINDEX(@bspace,r.ReplacedColumn) = 1
             THEN STUFF(r.ReplacedColumn,1,@len,'')
             ELSE STUFF(r.ReplacedColumn,r.ReplacedColumn)-1,'')
           END,r.Iteration + 1
    FROM rCTE r
    WHERE CHARINDEX(@bspace,r.ReplacedColumn) > 0)
SELECT TOP (1) WITH TIES
       r.YourColumn,r.ReplacedColumn
FROM rCTE r
ORDER BY ROW_NUMBER() OVER (PARTITION BY r.YourColumn ORDER BY r.Iteration DESC);

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。