问题描述
您需要按照Elias Hossain博士的回答中所示进行二进制排序。
解释是,模式语法中的范围适用于排序规则排序规则。
在范围搜索中,范围中包含的字符可能会根据归类的排序规则而有所不同。
所以
;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
*/