【发布时间】:2015-02-11 21:35:48
【问题描述】:
谁能解释为什么Replace 函数不能用string_replacement 替换所有出现的string_pattern?
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
谁能解释发生了什么?
【问题讨论】:
-
我只能猜测,但也许在第一次替换 ` A ` 之后它不会返回并重新评估整个字符串。在这种情况下,搜索从下一个
A开始,而不是从第一个 A 之前的空格开始。 -
如果分隔符一致,为什么不替换而不匹配尾随空格,例如
select REPLACE(' A A A A ',' A',' B') -
@ChrisMoutray 这只是一个例子。这个
select REPLACE('.A.A.A.A.','.A.','.B.')呢。我想知道它是如何工作的 -
我认为我的第一条评论已经很好地解释了这一点。不考虑第二个空格,因为它包含在第一个匹配项中。
-
所以对于你的第二个例子,你不包括尾随分隔符,即
REPLACE('.A.A.A.A.','.A','.B')
标签: sql sql-server sql-server-2008 tsql replace