【问题标题】:Significance of double percent signs (%%) in T-SQL PATINDEXT-SQL PATINDEX 中双百分号 (%%) 的意义
【发布时间】:2018-09-07 22:12:25
【问题描述】:

我遇到了一段旧的 T-SQL,它使用类似于以下的 PATINDEX 从文本列中提取日期:

CAST(SUBSTRING(MyText, PATINDEX('%%-[0-1][0-9]/[0-3][0-9]/[0-9][0-9]%%', DocumentHeaderText)+1, 8) AS DATE)

我看不出在通配符字符串的开头和结尾出现双百分号的原因,并且从谷歌搜索并查看PATINDEX documentation 看起来双百分号似乎没有什么比一个百分号。

但是,我之前曾被仓促“改进”遗留代码所困扰,发现原作者有充分的理由这样做并不得不将其改回。

所以我的问题是,T-SQL LIKE 或 PATINDEX 语句的通配符字符串中的%%% 之间有什么区别吗?我可以在不改变行为的情况下安全地更改代码吗:

CAST(SUBSTRING(MyText, PATINDEX('%-[0-1][0-9]/[0-3][0-9]/[0-9][0-9]%', DocumentHeaderText)+1, 8) AS DATE)

【问题讨论】:

  • 这可能与此处解释的行为类似:stackoverflow.com/a/29891436/1316856
  • @ParrishHusband 我严重怀疑它,因为patindex 函数没有escape 参数。此外,OP 的代码中没有任何内容表明两个通配符之间存在转义字符。
  • @ZoharPeled 是的,我同意最后一部分。然而,正如我们都经常经历的那样,遗留代码并不总是有意义的。
  • @ParrishHusband 可能只是一个快速修复(例如,如果在某些时候它是 %_[0-1]...[0-9]_% [这实际上是有道理的] 并且开发人员决定他们实际上不需要前后至少一个字符) , 但不是删除 _ 而是错误地将其转换为 %)。
  • @ZoharPeled 是的好想法

标签: sql sql-server tsql


【解决方案1】:

official documentation of PATINDEX 声明:

模式
是包含要查找的序列的字符表达式。可以使用通配符;但是,% 字符必须在模式之前和之后(搜索第一个或最后一个字符时除外)

% 通配符代表, 写在official documentation for LIKE:

任何零个或多个字符的字符串。

它可以代表包括零在内的任意数量的字符,这意味着%% 完全等同于%,并且可以安全地更改。

请注意,任何其他 T-SQL 通配符都不是这种情况 - 因为_ 代表单个字符,[][^]

【讨论】:

    猜你喜欢
    • 2011-11-03
    • 1970-01-01
    • 2021-08-08
    • 1970-01-01
    • 1970-01-01
    • 2010-11-18
    • 2022-08-03
    • 2022-08-07
    • 2021-01-16
    相关资源
    最近更新 更多