2010-11-18 22 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

相關問題