问题描述
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);