2012-06-08 14 views
19

Si ejecuto el código de abajo:Cómo hacer una distinción entre mayúsculas y minúsculas GROUP BY?

with temp as 
(
    select 'Test' as name 
    UNION ALL 
    select 'TEST' 
    UNION ALL 
    select 'test' 
    UNION ALL 
    select 'tester' 
    UNION ALL 
    select 'tester' 
) 
SELECT name, COUNT(name) 
FROM temp 
group by name 

Devuelve los resultados:

TEST 3 
tester 2 

¿Hay una manera de tener el grupo por caso, ser sensible, por lo que los resultados serían los siguientes:

Test 1 
TEST 1 
test 1 
tester 2 

Respuesta

15

puede utilizar un cotejo entre mayúsculas y minúsculas:

with temp as 
(
    select 'Test' COLLATE Latin1_General_CS_AS as name 
    UNION ALL 
    select 'TEST' 
    UNION ALL 
    select 'test' 
    UNION ALL 
    select 'tester' 
    UNION ALL 
    select 'tester' 
) 
SELECT name, COUNT(name) 
FROM temp 
group by name 
18

Debe convertir el texto como binario (o usar una intercalación de mayúsculas y minúsculas).

With temp as 
(
    select 'Test' as name 
    UNION ALL 
    select 'TEST' 
    UNION ALL 
    select 'test' 
    UNION ALL 
    select 'tester' 
    UNION ALL 
    select 'tester' 
) 
Select Name, COUNT(name) 
From temp 
Group By Name, Cast(name As varbinary(100)) 

Usando una colación:

Select Name Collate SQL_Latin1_General_CP1_CS_AS, COUNT(name) 
From temp 
Group By Name Collate SQL_Latin1_General_CP1_CS_AS 
+1

¿Hay razones para elegir un método sobre el otro? –

+0

El segundo puede usarse si no sabe qué valores posibles podría tener una tabla. – MrB

+0

Para MySQL, simplemente reemplace 'VARBINARY' con' BINARY', y funciona bien. – Balmipour

Cuestiones relacionadas