You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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]匹配数字)。

拆解你的两个模式:

  1. 第一个模式:%[a-z,A-Z,-,.]%
    这里的-位于A-Z和,之间,被解析成了范围运算符,尝试匹配Z到,之间的字符。但ASCII码里Z是90,,是44——起始字符的ASCII码大于结束字符,这个范围是无效的,不会匹配任何字符。剩下的匹配项只有小写字母、大写字母、逗号和句号,而你的目标字符串'16-82'里完全没有这些字符,所以PATINDEX返回0(表示未找到匹配)。

  2. 第二个模式:%[-,a-z,A-Z,.]%
    这个模式里的-在方括号的最开头,所以被当作普通字符处理。你的目标字符串'16-82'里的第三个字符就是-,所以PATINDEX返回它的位置3(SQL Server中字符串位置从1开始计数)。

正确写法建议

如果你想匹配大小写字母、短横线和句号,推荐两种可靠写法:

  • 把-放在方括号开头:[-a-zA-Z.]
  • 把-放在方括号结尾:[a-zA-Z.-]

这样就能确保-被当作普通字符,不会被误解析成范围运算符啦。

内容的提问来源于stack exchange,提问作者Brian B

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.28 09:57:33