SQL Server通配符字符范围例如[AD]如何与区分大小写的排序规则一起使用?

问题描述

您需要按照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个小写字母。

解决方法

谁能解释通配符字符范围(例如[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
*/