Как диапазон подстановочных знаков SQL Server, например [AD], работает с сортировкой с учетом регистра?

Может ли кто-нибудь объяснить правила того, как диапазон подстановочных знаков, например [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]%';

возвращает только те записи, которые начинаются с верхнего регистра A, B, C или D. Тем не менее, я бы подумал, что [A-D] будет эквивалентно [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
*/
9
задан Simon Tewsi 7 December 2011 в 04:47
поделиться