PATINDEX 查找短划线字符“-”时的错误结果

PATINDEX incorrect result when looking for dash character "-"

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

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

这两个模式匹配似乎检查相同的东西,但是 运行 自己编写代码,它会先打印 0,然后打印 3:

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

我不明白为什么 只有 如果破折号是我们检查的第一个字符。

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

字符组中的破折号可以扮演以下两个角色之一:

  • 它可能表示破折号本身,就像在表达式 [-abc]
  • 中一样
  • 它可能表示 "everything inbetween" 运算符,就像在表达式 [a-z].
  • 中一样

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

  • az
  • 的一切
  • 逗号,
  • AZ
  • 的一切
  • ,, 的所有内容(即又是逗号)。
  • .

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