¿Alguien puede explicar las reglas de cómo un rango de caracteres comodín, por ejemplo [A-D], funciona con una intercalación sensible a mayúsculas y minúsculas?¿Cómo funciona el Rango de caracteres comodín de SQL Server, por ejemplo [A-D], con intercalación de mayúsculas y minúsculas?
habría pensado el siguiente
WHERE CharColumn LIKE '[A-D]%';
volvería sólo los registros que comienzan con una letra mayúscula A, B, C o D, y excluir registros que comienzan con una caja inferior a, b, c o re.
Sin embargo, en realidad, parece devolver registros que comienzan con una mayúscula A pero también registros que comienzan con B o b, C o c y D o d. Es como si solo el primer carácter del rango distingue entre mayúsculas y minúsculas y los caracteres restantes del rango no distinguen entre mayúsculas y minúsculas.
Por otro lado, el siguiente
WHERE CharColumn LIKE '[ABCD]%';
qué sólo devuelven registros que comienzan con una letra mayúscula A, B, C o D. Sin embargo, habría pensado [AD] sería equivalente a [A B C D].
Obtengo los mismos resultados en SQL Server 2005 y SQL Server 2008 R2.
Ejemplo:
(instrucciones de inserción escriben con Server 2008 constructores de registros de SQL para compacidad Si cada valor se le da su propia instrucción de inserción de la secuencia de comandos funciona en 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
*/
Gracias, esto responde perfectamente a mi pregunta. Estaba tratando de entender la lógica detrás de los resultados aparentemente arbitrarios de una búsqueda en rango. Está muy claro ahora. Saludos, Simon. –