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

时间:2010-11-18 06:08:05

标签: 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]%'
                    , 'abCde' COLLATE SQL_Latin1_General_Cp1_CS_AS); 

我对第一种情况下使用范围的理解是否不正确?为什么这样的行为?

1 个答案:

答案 0 :(得分:6)

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

AbBcCdDeE...yYzZ

也就是说,小写字符紧跟在大写字母对应的前面。这也很有趣,因为如果你想处理大写和小写字符,在区分大小写的排序规则中,范围A-Z不包括小写字母a。


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