寻找短划线字符时,PATINDEX结果不正确" - "

时间:2018-05-23 23:31:24

标签: tsql patindex

这个简单的例子说明了我遇到的问题,但我不明白为什么......

我正在测试第一个字符的位置,该字符是大小写字母,单个短划线或传递给我的字符串参数中的句点。

这两个模式匹配似乎检查相同的事情,但是自己运行此代码并且它将打印0然后是3:

PRINT PATINDEX ( '%[a-z,A-Z,-,.]%', '16-82') 
PRINT PATINDEX ( '%[-,a-z,A-Z,.]%', '16-82') 

如果短划线字符是我们检查的第一个字符,我不明白它为什么只能

这是一个错误吗?或者按照设计工作,我错过了一些东西......我使用的是SQL Server 2016,但我认为这并不重要。

1 个答案:

答案 0 :(得分:3)

角色组中的破折号可以扮演两个角色中的任何一个:

  • 它可以表示破折号本身,就像在表达式[-abc]
  • 中一样
  • 它可能表示"中间的一切"运算符,就像在表达式[a-z]中一样。

在您的特定示例中,字符组[a-z,A-Z,-,.]表示以下内容:

  • az
  • 的所有内容
  • 逗号,
  • AZ
  • 的所有内容
  • ,,的所有内容(即再次使用逗号)。
  • .

事实上,你可能想写[-a-zA-Z.]