2014-12-13 58 views
3

任何人都可以解釋爲什麼Replace函數不能代替所有string_patternstring_replacementSQL Server替換函數的工作

select REPLACE(' A A A A ',' A ',' B ') 

輸出:B A B A

預期輸出:B B B B

select REPLACE('.A.A.A.A.','.A.','.B.') 

輸出:.B.A.B.A.

預期輸出:.B.B.B.B.

在上面的查詢中爲什麼只有替代值被替換?

我知道上面的問題可以通過加入來修復一個替換之類的問題。

select replace(REPLACE('.A.A.A.A.A.A.A.A.A.','.A.','.B.'),'.A.','.B.') 

但爲什麼單Replace不替代string_patternstring_replacement

所有發生誰能解釋怎麼回事?

+0

我只能猜測,但也許以後首先替換'A'它不會返回並重新評估整個字符串。在這種情況下,搜索從下一個「A」開始,而不是從第一個A開始。 – 2014-12-13 06:26:43

+0

如果分隔符是一致的,那麼爲什麼不替換而不匹配尾隨空格,例如'select REPLACE('A A A A','A','B')' – 2014-12-13 06:28:44

+0

@ChrisMoutray僅僅是一個例子。那麼選擇REPLACE('.A.A.A.','。A。','。B'')'。我想知道它是如何工作的 – 2014-12-13 06:33:47

回答

7

第一個A作爲第一個匹配的一部分後的第一個空間(或期間)。例如:

.A.A.A.A. 
111 222 

1 s爲第一次匹配,並且2 s爲第二匹配。在完成第一次替換之後,該功能正在查看第二個A並且不會備份。 A.A不匹配,所以它向前移動並看着.A.

換句話說,你試圖匹配重疊的字符串。這就像在下面與job更換bob

bobob 

你期待看到jojob,但這不是它的工作原理。第一次替換後,您有jobob,但替換功能已轉移到第二個o。它不會再看到bob s,所以它停止。

0

拿到願望輸出就應該更換 'A' 與 'B',而不包括空間

SELECT REPLACE(' A A A A ', 'A', 'B') 

SELECT REPLACE('.A.A.A.A.', 'A', 'B')