Per*_* P. 7 sql sql-server wildcard collation
使用PATINDEX和区分大小写的排序规则来搜索字符串中的大写字母,我注意到这并没有产生所需的结果:
-- returns 1
SELECT PATINDEX('%[A-Z]%'
, 'abCde' COLLATE SQL_Latin1_General_Cp1_CS_AS);
Run Code Online (Sandbox Code Playgroud)
但是,指定每个字母AZ会:
-- returns 3
SELECT PATINDEX('%[ABCDEFGHIJKLMNOPQRSTUVWXYZ]%'
, 'abCde' COLLATE SQL_Latin1_General_Cp1_CS_AS);
Run Code Online (Sandbox Code Playgroud)
我对在第一种情况下使用范围的理解是否不正确?为什么这样的行为?
不幸的是,范围运营商有点滑稽.AZ的字母范围是:
AbBcCdDeE...yYzZ
Run Code Online (Sandbox Code Playgroud)
也就是说,小写字符紧跟在大写字母对应之前.这也很有趣,因为如果你想处理大写和小写字符,在区分大小写的排序规则中,范围AZ排除小写字母a.
关于范围如何扩展,我应该说上面的内容是基于我通常使用的排序规则.范围实际扩展的方式取决于排序规则.如果您可以找到一个排序规则,例如,所有大写字符出现在所有小写字符之前,那么该范围将按预期工作.(可能是二进制排序规则之一?)