这个简单的例子显示了我遇到的问题,但我不明白为什么......
我正在测试传递给我的字符串参数中第一个字符的位置,该字符是小写或大写字母、单个破折号或句点。
这两个模式匹配似乎检查了同一件事,但自己运行此代码,它将打印 0 然后打印 3:
PRINT PATINDEX ( '%[a-z,A-Z,-,.]%', '16-82')
PRINT PATINDEX ( '%[-,a-z,A-Z,.]%', '16-82')
我不明白为什么只有当破折号字符是我们检查的第一个字符时它才有效。
这是一个错误吗? 或者按设计工作,我错过了一些东西...... 我使用的是SQL Server 2016,但我认为这并不重要。
字符组中的破折号可以扮演以下两个角色之一:
- 它可以表示破折号本身,就像它在表达式中所做的那样
[-abc]
- 它可以表示"介于两者之间的一切"运算符,就像它在表达式
[a-z]
中所做的那样。
在您的特定示例中,字符组[a-z,A-Z,-,.]
表示以下内容:
- 从
a
到z
的一切 - 逗号
,
- 从
A
到Z
的一切 - 从
,
到,
的所有内容(即再次只是逗号(。 - 点
.
事实上,你可能想写[-a-zA-Z.]