任何人都可以解释通配符字符范围的规则,例如[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]%';
does 只返回以大写字母A,B,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
*/
4 回答
尝试
它可以以任何一种方式完成:
一个 . 创建表时使用
COLLATE
:湾选择数据时使用
COLLATE
您需要二进制排序规则,如Md. Elias Hossain's answer所示 .
解释是模式语法中的范围可以解决排序规则排序顺序规则 .
From BOL
所以
返回
所以范围
A-D
排除a
但包括CS
整理下的其他3个小写字母 .使用区分大小写的排序规则适用于不在范围内的搜索字符串,例如这会工作:
......但显然这不是一种可接受的方法!
正如其他人所建议的那样,使用
Latin1_General_BIN
作为范围 .