Qualcuno può spiegare le regole per come un intervallo di caratteri jolly, ad esempio [A-D], funziona con una fascicolazione case-sensitive?In che modo la gamma di caratteri jolly di SQL Server, ad esempio [A-D], funziona con le regole di confronto con distinzione tra maiuscole e minuscole?
avrei pensato seguente
WHERE CharColumn LIKE '[A-D]%';
restituirebbe solo i record che si aprono con un caso superiore A, B, C o D, ed escludere i record che iniziano con una minuscola a, b, c o d.
Tuttavia, in realtà, sembra che vengano restituiti record che iniziano con una lettera maiuscola A ma anche record che iniziano con B o b, C o c e D o d. È come se solo il primo carattere dell'intervallo distingue tra maiuscole e minuscole e i caratteri rimanenti nell'intervallo non fanno distinzione tra maiuscole e minuscole.
D'altra parte, il seguente
WHERE CharColumn LIKE '[ABCD]%';
fa restituire solo i record che si aprono con un caso superiore A, B, C o D. Tuttavia avrei pensato [AD] sarebbe equivalente [ABCD].
Ottengo gli stessi risultati in SQL Server 2005 e SQL Server 2008 R2.
Esempio:
(istruzioni INSERT scritti con SQL Server 2008 costruttori di riga per la compattezza Se ogni valore viene dato il proprio istruzione di inserimento lo script funzionerà in 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
*/
Grazie, risponde perfettamente alla mia domanda. Stavo cercando di capire la logica dietro i risultati apparentemente arbitrari da una ricerca di distanza. Adesso è molto chiaro. Saluti, Simon. –