Come utilizzare l'istruzione SQL per istruzione per ordinare i risultati senza distinzione tra maiuscole e minuscole?


144

Ho un database SQLite che sto cercando di ordinare in ordine alfabetico. Il problema è che SQLite non sembra considerare A = a durante l'ordinamento, quindi ottengo risultati come questo:

A B C T a b c g

Voglio ottenere:

A a b B C c g T

Quale speciale cosa SQL deve essere fatta di cui non sono a conoscenza?

SELECT * FROM NOTES ORDER BY title

2
E qual è il modo più efficiente per farlo? "ORDINA PER TITOLO COLLATE NOCASE" o "ORDINA PER INFERIORE (TITOLO)". (Cordiali saluti, nel mio caso, in esecuzione su Android, cioè SQLite)
Pascal

Risposte:


253

Puoi anche fare ORDER BY TITLE COLLATE NOCASE.

Modifica: se è necessario specificare ASCo DESC, aggiungere questo dopo mi NOCASEpiace

ORDER BY TITLE COLLATE NOCASE ASC

o

ORDER BY TITLE COLLATE NOCASE DESC

8
"ORDER BY TITLE COLLATE NOCASE" è più efficace di "ORDER BY LOWER (TITLE)"?
Pascal,

Che fa schifo! non è vero? Wow! perché diamine SQLite lo sta facendo distinzione tra maiuscole e minuscole per l'ordinamento .... non rientra nella mia mente ... purtroppo!
Vincy,

1
@Vincy: non vedo cosa c'è di così strano nel confronto tra maiuscole e minuscole. Ecco come la <, ==ecc operatori lavorano per impostazione predefinita in ogni linguaggio di programmazione che ho familiarità con.
dan04,

@ dan04 quanto spesso hai bisogno di una stringa che deve essere sensibile al maiuscolo / minuscolo? ecco perché è ridicolo. a chi nel mondo importa dei casi mentre si ordina una stringa? L'unico posto in cui vedo il vantaggio è per l'autenticazione o la convalida della password! Ecco perché, per impostazione predefinita, deve essere CASE INSENSITIVE, imo!
Vincy

Questo di solito non funzionerà immediatamente, se il database utilizza UTF8. (Si noti che il titolo non si riferisce solo a SQLite.) In questo caso, il suggerimento di utilizzare lower () o upper () di seguito è quello che funziona.
marco,

99

Puoi semplicemente convertire tutto in minuscolo ai fini dell'ordinamento:

SELECT * FROM NOTES ORDER BY LOWER(title);

Se vuoi assicurarti che quelli maiuscoli finiscano ancora prima di quelli minuscoli, aggiungilo come ordinamento secondario:

SELECT * FROM NOTES ORDER BY LOWER(title), title;

1
Sto ordinando per più colonne, devo mettere il INFERIORE attorno a ciascuna?
CodeFusionMobile

2
Sì, non è possibile modificare il comportamento di ORDER BY in modo che non faccia distinzione tra maiuscole e minuscole.
Chad Birch,

1
C'è qualche differenza tra 'UPPER' e 'LOWER'
Jagadeesh

2
A tal fine, no, entrambi otterranno lo stesso effetto, ovvero rendere lo stesso caso di tutti gli articoli.
Ben Baron,

1
Differiscono solo per i caratteri [] ^ _ `.
dan04,

0
SELECT * FROM NOTES ORDER BY UPPER(title)              

14
Grazie per la tua risposta. Ma: una buona risposta avrà sempre una spiegazione di ciò che è stato fatto e del perché sia ​​stato fatto in questo modo, non solo per l'OP ma anche per i futuri visitatori di SO.
B001 ᛦ
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.