SQL Server中PATINDEX查找短横线时结果异常的原因咨询
这不是Bug,是SQL Server的设计规则!
你提到的这两段SQL代码:
PRINT PATINDEX ( '%[a-z,A-Z,-,.]%', '16-82') PRINT PATINDEX ( '%[-,a-z,A-Z,.]%', '16-82')
执行后分别返回0和3,这完全是SQL Server中LIKE/PATINDEX语法的预期行为,不是Bug。核心原因在于方括号[]内短横线-的解析规则:
- 当
-出现在方括号的最开头或最结尾时,它会被当作普通字符匹配; - 如果
-夹在两个字符中间,SQL Server会把它识别为字符范围运算符(比如[a-z]匹配所有小写字母,[0-9]匹配数字)。
拆解你的两个模式:
第一个模式:
%[a-z,A-Z,-,.]%
这里的-位于A-Z和,之间,被解析成了范围运算符,尝试匹配Z到,之间的字符。但ASCII码里Z是90,,是44——起始字符的ASCII码大于结束字符,这个范围是无效的,不会匹配任何字符。剩下的匹配项只有小写字母、大写字母、逗号和句号,而你的目标字符串'16-82'里完全没有这些字符,所以PATINDEX返回0(表示未找到匹配)。第二个模式:
%[-,a-z,A-Z,.]%
这个模式里的-在方括号的最开头,所以被当作普通字符处理。你的目标字符串'16-82'里的第三个字符就是-,所以PATINDEX返回它的位置3(SQL Server中字符串位置从1开始计数)。
正确写法建议
如果你想匹配大小写字母、短横线和句号,推荐两种可靠写法:
- 把
-放在方括号开头:[-a-zA-Z.] - 把
-放在方括号结尾:[a-zA-Z.-]
这样就能确保-被当作普通字符,不会被误解析成范围运算符啦。
内容的提问来源于stack exchange,提问作者Brian B
相关产品推荐
相关产品推荐

