有人可以解释为什么Replace
函数不会将所有string_pattern
替换为string_replacement
?
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_pattern
与string_replacement
任何人都可以解释发生了什么事吗?
答案 0 :(得分:7)
第一个A
之后的第一个空格(或句号)计为第一个匹配的一部分。例如:
.A.A.A.A.
111 222
1
是第一个匹配,2
是第二个匹配。完成第一次替换后,该功能正在查看第二个A
并且没有备份。 A.A
不匹配,因此会前进并查看.A.
。
换句话说,您正在尝试匹配重叠的字符串。这就像尝试使用以下bob
替换job
一样:
bobob
您希望看到jojob
,但这不是它的工作方式。第一次替换后,您有jobob
,但替换功能已经转移到第二个o
。它不再看到bob
,所以它会停止。
答案 1 :(得分:0)
要获得欲望输出,您应该将'A'替换为'B',而不包括空格
喜欢
SELECT REPLACE(' A A A A ', 'A', 'B')
和
SELECT REPLACE('.A.A.A.A.', 'A', 'B')