2012-06-08 35 views
19

Nếu tôi thực thi mã bên dưới:Làm thế nào để làm một trường hợp nhạy cảm 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 

Nó trả về kết quả:

TEST 3 
tester 2 

Có cách nào để có nhóm bởi trường hợp nhạy cảm do đó kết quả sẽ là:

Test 1 
TEST 1 
test 1 
tester 2 

Trả lời

15

Bạn có thể sử dụng một trường hợp đối chiếu nhạy cảm:

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

Bạn cần truyền văn bản dưới dạng nhị phân (hoặc sử dụng đối chiếu phân biệt chữ hoa chữ thường).

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)) 

Sử dụng một collation:

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

Có lý do để lựa chọn một phương pháp khác không? –

+0

Cách thứ hai có thể sử dụng nếu bạn không biết giá trị có thể có của bảng. – MrB

+0

Đối với MySQL, chỉ cần thay thế 'VARBINARY' bằng' BINARY' và nó hoạt động tốt. – Balmipour

Các vấn đề liên quan