2010-11-18 58 views
7

使用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); 

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

+0

感谢这一点,我需要提取以大写字母开头的行:PATINDEX('[ABCDEFGHIJKLMNOPQRSTUVWXYZ]%',[NAME] COLLATE SQL_Latin1_General_Cp1_CS_AS)= 1 – 2011-05-13 03:23:51

回答

6

不幸的是,范围运算符有点搞笑。来自A-Z的字母范围是:

AbBcCdDeE...yYzZ 

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


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

+1

@Damien_The_Believer !切换到Latin1_General_100_BIN2产生相同的结果,3,在我的问题上面的两个片段..谢谢澄清 – 2010-11-18 07:53:11