【发布时间】: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