2009-08-23 14 views
8

Ho una tabella definita da:ORDER BY su diverse colonne in direzioni diverse, in SQLite

CREATE TABLE bar_table (
     _id INTEGER NOT NULL PRIMARY KEY, 
     index INTEGER NOT NULL DEFAULT '65535', 
     _date DATE 
    ) 

mia dichiarazione prescelta di base è:

SELECT * FROM bar_table ORDER BY <your-clause-here> 

Come posso ordinare mia selezione per indice ascendente, e data discendente? cioè piccoli indici vengono prima di grandi indici. Nel caso in cui due indici siano uguali, la data successiva deve essere la prima.

La documentazione mi sta indicando verso COLLATion, ubut non sono davvero sicuro di cosa si tratta.

risposta

21

Mentre so che hai già la tua risposta qui, penso che sia pertinente entrare nei dettagli al lavoro qui.

Innanzitutto, la clausola order by va in ordine di colonne o espressioni specificate. In questo caso:

order by index asc, _date desc 

Quella sorta di index piccolo al più grande (asc finale), e poi _date grande al più piccolo (desc finale). Mentre asc è il valore predefinito, generalmente lo includo quando ho più colonne che vanno in direzioni opposte, come fai qui.

È inoltre possibile includere espressioni contenute nel order by:

order by case when index < 0 then 1 else 0 end desc, _date desc 

Questo sarebbe mettere tutti i negativi index righe in alto, e poi ordinare quelle di _date. L'utilizzo di espressioni nella clausola order by è molto efficace in determinate circostanze.

Ora, hai citato collation e un po 'di confusione su ciò che è. Le regole di confronto sono le modalità con cui il database tratta il capitale e gli accenti nei confronti delle stringhe. Con una fascicolazione sensibile alla captazione, 'abc' != 'ABC'. Tuttavia, con una fascicolazione senza distinzione di tipo Captial, 'abc' = 'ABC'.

Si noti che la fascicolazione è non un set di caratteri. Di solito è determinato dal tipo di dati (varchar == ASCII, nvarchar == Unicode). La fascicolazione determina come vengono confrontate le stringhe, non quali set di caratteri sono disponibili per l'uso.

Inoltre, le regole di confronto sono importanti anche in alcune lingue. Dato un collation latino, devi solo preoccuparti di capitalizzazione e accenti, ma dato un confronto danese, 'aa' = 'å'. In questo modo è possibile vedere che le regole di confronto svolgono un ruolo importante nel determinare l'ordinamento e i confronti per lingue diverse.

La collazione è molto importante quando si ordina, perché determina come verranno ordinate le stringhe date diverse maiuscole e accenti. Ecco perché continua a venire nelle tue ricerche. La collazione è importante, e anche questa settimana è affected StackOverflow!

: Grazie a Michael Madsen per aver indicato questo esempio specifico.

+0

La collazione non è solo una questione di confronto di lettere maiuscole e accenti, è l'ordinamento dei caratteri in generale, comprese le sequenze di caratteri regolari come equivalenti ad altri caratteri. Ad esempio, in danese, "aa" è ancora un modo valido per scrivere "å", anche se å è l'ultima lettera dell'alfabeto danese, quindi usare una collazione danese ordinerebbe il testo di conseguenza (di solito è corretto data la lingua prevista, e il computer non può decidere da solo se si tratta di un caso come la città tedesca di Aquisgrana, dove aa non è ovviamente usato come å). –

+1

Grazie. Sono abbastanza sicuro di aver provato il tuo suggerimento di 'ordinare per indice asc, _date desc', ma senza successo. – jamesh

+0

@jamesh: Davvero? Sei sicuro? Perché funzionerebbe su quasi tutti i RDBMS là fuori. L'unica volta che ho potuto pensare a dove questo non avrebbe funzionato è se '_date' fosse un campo' varchar' piuttosto che uno 'datetime'. Forse hai bisogno di incapsulare 'index' con i backtick, come' \ 'index \' '. – Eric

Problemi correlati