有人能解释通配符字符范围(如a)如何使用区分大小写的排序规则吗?
我本以为
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、B、C或D开头的记录,但我认为an相当于ABCD。
我在Server 2005和Server 2008 R2中得到了相同的结果。
示例:
(插入使用Server 2008行构造函数编写的语句以确保紧凑性。如果每个值都有自己的insert语句,则脚本将在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
*/发布于 2011-12-07 08:30:38
您需要一个二进制排序规则,如医学博士。伊莱亚斯·侯赛因的回答中所示。
其解释是模式语法中的范围工作在排序规则排序规则上。
从波尔
在范围搜索中,范围中包含的字符可能会根据排序规则的排序规则而有所不同。
所以
;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个小写字母。
发布于 2011-12-07 07:40:51
这两种方法都可以做到:
在创建表时使用COLLATE,如下所示:
CREATE TABLE #TEST_LIKE_Patterns
(
ID INT IDENTITY(1,1),
CharColumn VARCHAR(100) COLLATE Latin1_General_BIN
);b.在选择数据时使用COLLATE
SELECT *
FROM #TEST_LIKE_Patterns
WHERE CharColumn LIKE '%[A-D]%' COLLATE Latin1_General_BIN;发布于 2011-12-07 05:25:53
试一试
SELECT *
FROM #TEST_LIKE_Patterns
WHERE CharColumn LIKE '[A-D]%' COLLATE Latin1_General_BIN;https://stackoverflow.com/questions/8410523
复制相似问题