谁能解释通配符字符范围(例如[AD])如何使用区分大小写的排序规则的规则?
我本以为以下
WHERE CharColumn LIKE '[A-D]%';
将仅返回以大写A,B,C或D开头的记录,并排除以小写a,b,c或d开头的记录。
但是,实际上,它似乎返回以大写字母A开头的记录,但也返回以B或b,C或c以及D或d开头的记录。就像范围的第一个字符区分大小写,而范围中的其余字符也不区分大小写。
另一方面,以下
WHERE CharColumn LIKE '[ABCD]%';
并 仅返回与上壳体的开始记录,B,C或D.然而,我会想到[AD]将相当于[ABCD]。
在SQL Server 2005和SQL Server 2008 R2中,我得到相同的结果。
示例:( 使用SQL Server 2008行构造函数编写的插入语句具有紧凑性。如果每个值都具有自己的插入语句,则该脚本将在SQL Server 2005中运行)
CREATE TABLE #TEST_LIKE_Patterns ( ID INT IDENTITY(1,1), CharColumn VARCHAR(100) COLLATE Latin1_General_CS_AS ); -------------- INSERT INTO #TEST_LIKE_Patterns (CharColumn) VALUES ('aaa'), ('aAA'), ('AAA'), ('Aaa'); -------------- INSERT INTO #TEST_LIKE_Patterns (CharColumn) VALUES ('bbb'), ('bBB'), ('BBB'), ('Bbb'); -------------- INSERT INTO #TEST_LIKE_Patterns (CharColumn) VALUES ('ccc'), ('cCC'), ('CCC'), ('Ccc'); -------------- INSERT INTO #TEST_LIKE_Patterns (CharColumn) VALUES ('ddd'), ('dDD'), ('DDD'), ('Ddd'); -------------- INSERT INTO #TEST_LIKE_Patterns (CharColumn) VALUES ('eee'), ('eEE'), ('EEE'), ('Eee'); -------------- INSERT INTO #TEST_LIKE_Patterns (CharColumn) VALUES ('fff'), ('fFF'), ('FFF'), ('Fff'); -------------- -- Raw Data: SELECT * FROM #TEST_LIKE_Patterns; SELECT * FROM #TEST_LIKE_Patterns WHERE CharColumn LIKE '[A-D]%'; -- Results: /* ID CharColumn -------------- 3 AAA 4 Aaa 5 bbb 6 bBB 7 BBB 8 Bbb 9 ccc 10 cCC 11 CCC 12 Ccc 13 ddd 14 dDD 15 DDD 16 Ddd */ SELECT * FROM #TEST_LIKE_Patterns WHERE CharColumn LIKE '[ABCD]%'; -- Results: /* ID CharColumn -------------- 3 AAA 4 Aaa 7 BBB 8 Bbb 11 CCC 12 Ccc 15 DDD 16 Ddd */
您需要按照Elias Hossain博士的回答中所示进行二进制排序。
解释是,模式语法中的范围适用于排序规则排序规则。
从BOL
在范围搜索中,范围中包含的字符可能会根据归类的排序规则而有所不同。
所以
;WITH T(C) AS ( SELECT 'A' UNION ALL SELECT 'B' UNION ALL SELECT 'C' UNION ALL SELECT 'D' UNION ALL select 'a' union all select 'b' union all select 'c' union all select 'd' ) SELECT * FROM T ORDER BY C COLLATE Latin1_General_CS_AS
退货
C ---- a A b B c C d D
因此,该范围A-D排除a但包括CS归类下的其他3个小写字母。
A-D
a
CS