Sql server 替换未找到所有引用

Sql server 替换未找到所有引用,sql-server,string,Sql Server,String,在编写代码进行解析时遇到这种意外行为-SQL列中的分隔列表 我现在要做的是只替换被分隔符包围的事件,以避免误报。如果没有分隔符,在“Alice;Bob;Alice;Alice in Wonderland;Charlie”中替换“Alice”将生成“Bob;in Wonderland;Charlie” 要复制的代码: SELECT REPLACE('Alice;Alice;Alice;Alice;Alice;Alice',';Alice;',';Bob;') 这是Alice的6个重复,其中4个被

在编写代码进行解析时遇到这种意外行为-SQL列中的分隔列表

我现在要做的是只替换被分隔符包围的事件,以避免误报。如果没有分隔符,在“Alice;Bob;Alice;Alice in Wonderland;Charlie”中替换“Alice”将生成“Bob;in Wonderland;Charlie”

要复制的代码:

SELECT REPLACE('Alice;Alice;Alice;Alice;Alice;Alice',';Alice;',';Bob;')
这是Alice的6个重复,其中4个被分隔符包围。预期结果:

Alice;Bob;Bob;Bob;Bob;Alice
实际结果:

Alice;Bob;Alice;Bob;Alice;Alice
为什么第三个和第五个Alice没有被替换

我的理论是,当REPLACE在第二个位置找到“Alice;”时,它会“保留”该文本块,因此下面的第三个“Alice;”与第二个字符重叠一个字符,无法作为匹配项进行替换。逻辑上足够了,因为替换第一次发现的事件可能会用任何东西替换它;例如,如果它将其替换为“#Alice#”,那么第三个“Alice;”现在将是“#Alice;”-不匹配

在本例中,REPLACE实际上并没有改变第二个和第三个实例共享的“;”:但在内部,REPLACE函数是谨慎的,只是移动到第二个实例的最后一个字符。第四次和第五次也会发生同样的情况

解决方法是在一段时间内包装替换,直到不再找到搜索字符串


有人有更好的解释或解决方法吗?

这里是两个匹配的
的可视化表示;爱丽丝将被替换为
;鲍勃


既然您提出了解决方案,我会暂时用双冒号替换分隔符:

SELECT 
REPLACE(
    REPLACE(
        REPLACE('Alice;Alice;Alice;Alice;Alice;Alice',';',';;')  -- First, make your delimiter a double colon so it can be independently consumed
        ,';Alice;',';Bob;'                                      -- Then, search as your initial idea
    )
,';;',';'                                                       -- Finally, revert to single-length delimiters
)
结果:

爱丽丝;上下快速移动上下快速移动上下快速移动上下快速移动爱丽丝


它没有保留任何东西。只是在寻找下一个匹配项时没有考虑替换项的文本。它不会每次从字符串的开头寻找另一个匹配项,而是从上一次替换结束后的下一个字符开始。否则,创建无限替换循环就很容易了。它按预期工作<代码>替换
不会两次替换同一字符。否则,
REPLACE('ABC','C','CD')
将无限循环。