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.