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,-,.]
表示以下内容:
- 从
a
到 z
的一切
- 逗号
,
- 从
A
到 Z
的一切
- 从
,
到 ,
的所有内容(即又是逗号)。
- 点
.
事实上,你可能想写 [-a-zA-Z.]
这个简单的例子说明了我 运行 遇到的问题,但我不明白为什么...
我正在测试传递给我的字符串参数中第一个字符(小写或大写字母、单个短划线或句点)的位置。
这两个模式匹配似乎检查相同的东西,但是 运行 自己编写代码,它会先打印 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,-,.]
表示以下内容:
- 从
a
到z
的一切
- 逗号
,
- 从
A
到Z
的一切
- 从
,
到,
的所有内容(即又是逗号)。 - 点
.
事实上,你可能想写 [-a-zA-Z.]