一尘不染

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

sql

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

-- returns 1
SELECT PATINDEX('%[A-Z]%'
                    , 'abCde' COLLATE SQL_Latin1_General_Cp1_CS_AS);

但是,指定每个字母AZ可以:

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

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


阅读 149

收藏
2021-03-10

共1个答案

一尘不染

不幸的是,范围运算符有点可笑。AZ的字母范围是:

AbBcCdDeE...yYzZ

即,小写字符紧接在大写字母之前。这也很有趣,因为如果要同时处理大小写字符,则在区分大小写的排序规则中,范围AZ排除小写字母a。


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

2021-03-10