【问题标题】:Working of SQL Server Replace FunctionSQL Server 替换功能的工作
【发布时间】: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


【解决方案1】:

第一个 A 之后的第一个空格(或句点)算作第一个匹配项的一部分。示例:

.A.A.A.A.
111 222

1s 是第一个匹配项,2s 是第二个匹配项。完成第一次替换后,该函数正在查看第二个 A 并且不备份。 A.A 不匹配,所以它向前移动并查看.A.

换句话说,您正在尝试匹配重叠的字符串。这就像在下面尝试用job 替换bob

bobob

您希望看到jojob,但这不是它的工作原理。在第一次替换之后,您有jobob,但替换功能已经转移到第二个o。它不再看到bobs,所以它停止了。

【讨论】:

    【解决方案2】:

    要获得所需的输出,您应该将“A”替换为“B”,不包括空格

    喜欢

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

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

    【讨论】:

      猜你喜欢
      • 2022-11-14
      • 2015-09-28
      • 1970-01-01
      • 1970-01-01
      • 2016-11-12
      • 1970-01-01
      • 1970-01-01
      • 2021-04-28
      • 2012-09-04
      相关资源
      最近更新 更多