使用SQL Server替换函数

时间:2014-12-13 06:12:37

标签: sql sql-server sql-server-2008 tsql replace

有人可以解释为什么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_patternstring_replacement

一起取代

任何人都可以解释发生了什么事吗?

2 个答案:

答案 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')