2010-04-15 14 views
27

Ho il problema, che MSSQL Server 2000 dovrebbe selezionare alcuni valori distinti da una tabella (la colonna specifica è del tipo nvarchar). Ci sono le volte gli stessi valori, ma con diversi casi, ad esempio (pseudocodice):"SELECT DISTINCT" ignora i diversi casi

SELECT DISTINCT * FROM ("A", "a", "b", "B") 

sarebbero tornati

A,b 

ma voglio (e si aspettano)

A,a,b,B 

perché in realtà sono valori diversi.

Come risolvere questo problema?

+2

Che fascicolazione usi per la colonna? –

risposta

47

La fascicolazione sarà impostata su non sensibile al maiuscolo/minuscolo.

Hai bisogno di fare qualcosa di simile

Select distinct col1 COLLATE sql_latin1_general_cp1_cs_as 
From dbo.myTable 
+0

Non conoscevo COLLATE, ma questa è la soluzione. Accetterò questo, non appena mi sarà permesso (6 minuti a sinistra). Grazie! – powerbar

+4

Non dimenticare di aggiungere "come col1" per evitare di perdere il nome della colonna nel risultato! – MKorsch

+0

'latin1_general_ci' funziona per la maggior parte dei caratteri latini, ma' utf8mb4_unicode_ci', come mostrato da ['show collation'] (https://dev.mysql.com/doc/refman/5.7/en/show-collation.html) dovrebbe lavorare per tutto. –

1
SELECT DISTINCT 
    CasedTheColumn 
FROM 
    (
    SELECT TheColumn COLLATE LATIN1_GENERAL_BIN AS CasedTheColumn 
    FROM myTAble 
    )FOO 
WHERE 
    CasedTheColumn IN ('A', 'a'...) 
0

Provare a impostare la collation della colonna in questione a qualcosa di binario, per esempio utf8-bin. Puoi farlo in the SELECT statement itself o modificando direttamente la struttura della tabella (il che significa che non è necessario eseguire il mapping delle regole di confronto ogni volta che viene eseguita la query, poiché verrà memorizzata correttamente internamente).

4

Utilizzare BINARY per questa operazione. Gettate la colonna in binario in questo modo:

SELECT DISTINCT BINARY(column1) from table1; 

Basta cambiare column1 e table1 secondo il vostro schema.

esempio completa che funziona per me in MySQL 5.7, dovrebbe funzionare per gli altri:

SELECT DISTINCT BINARY(gateway) from transactions; 

Cheers!

+0

Opzione molto più pulita! – brianlmerritt

+0

Questo è molto meglio. Non voglio cambiare le regole di confronto di ogni tabella in cui devo fare una ricerca come questa. – carla

Problemi correlati