任何人都可以解释通配符字符范围的规则,例如[A-D],如何使用区分大小写的排序规则?
我会想到以下几点
- WHERE CharColumn LIKE '[A-D]%';
只返回以大写字母A,B,C或D开头的记录,并排除以小写字母a,b,c或d开头的记录.
然而,实际上,它似乎返回以大写字母A开头的记录,但也记录以B或b,C或c和D或d开头的记录.这就像只有范围的第一个字符区分大小写,范围中的其余字符不区分大小写.
另一方面,以下
- WHERE CharColumn LIKE '[ABCD]%';
只返回以大写字母A,C或D开头的记录.但我认为[A-D]相当于[ABCD].
我在sql Server 2005和sql Server 2008 R2中获得了相同的结果.
例:
(插入使用sql Server 2008行构造函数编写的语句,以实现紧凑性.如果每个值都有自己的insert语句,则脚本将在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
- */
解决方法
您需要二进制排序规则,如
Md. Elias Hossain’s answer所示.
解释是模式语法中的范围可以解决排序规则排序顺序规则.
In range searches,the characters included in the range may vary
@H_301_35@
depending on the sorting rules of the collation.所以
- ;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个小写字母.