Sql 区分大小写排序规则的范围通配符模式匹配行为

Sql 区分大小写排序规则的范围通配符模式匹配行为,sql,sql-server,wildcard,collation,Sql,Sql Server,Wildcard,Collation,使用PATINDEX和区分大小写的排序规则来搜索字符串中的大写字母,我注意到这并没有产生预期的结果: -- returns 1 SELECT PATINDEX('%[A-Z]%' , 'abCde' COLLATE SQL_Latin1_General_Cp1_CS_AS); 但是,指定每个字母A-Z会: -- returns 3 SELECT PATINDEX('%[ABCDEFGHIJKLMNOPQRSTUVWXYZ]%'

使用PATINDEX和区分大小写的排序规则来搜索字符串中的大写字母,我注意到这并没有产生预期的结果:

-- returns 1
SELECT PATINDEX('%[A-Z]%'
                    , 'abCde' COLLATE SQL_Latin1_General_Cp1_CS_AS); 
但是,指定每个字母A-Z会:

-- returns 3
SELECT PATINDEX('%[ABCDEFGHIJKLMNOPQRSTUVWXYZ]%'
                    , 'abCde' COLLATE SQL_Latin1_General_Cp1_CS_AS); 

我对在第一种情况下使用量程的理解是否不正确?为什么会有这样的行为?

不幸的是,范围运算符有点滑稽。从A到Z的字母范围为:

AbBcCdDeE...yYzZ
也就是说,小写字符紧跟在大写字符之前。这也很有趣,因为如果您想要处理大写和小写字符,在区分大小写的排序规则中,范围a-Z不包括小写a



我应该说,以上关于范围如何扩展的内容是基于我通常使用的排序规则。范围实际上是如何扩展的。例如,如果您可以找到一个排序规则,其中所有大写字符出现在所有小写字符之前,那么该范围将按照您的预期工作。(可能是一种二进制排序?

点击@Damien_信徒!切换到拉丁语1_General_100_BIN2对我上面问题中的两个代码段产生相同的结果3。。感谢您的澄清这篇文章可能也很有帮助:谢谢,我需要提取仅以大写字母开头的行:PATINDEX(“[ABCDEFGHIJKLMNOPQRSTUVWXYZ]”,[NAME]COLLATE SQL\u Latin1\u General\u Cp1\u CS\u AS)=1