2009-09-09 17 views
6

Ho una tabella semplice, qualcosa del tipo: int id, date created_at, date updated_at. Vorrei ordinare le righe in modo che tutte le righe che hanno un updated_at verranno ordinate in base a questo, e quelle che non verranno ordinate dal created_at. Il problema è che qualcosa di simile:Ordinamento tramite più campi in SQLite

SELECT * FROM table ORDER BY updated_at, created_at 

non funziona. Ho esaminato clausole di ordine personalizzato, qualcosa del tipo:

ORDER BY CASE WHERE updated_at ISNULL <do something> END, created_at 

ma non riesco a ottenere nulla a lavorare. Aiuto?

EDIT: avrei specificato che voglio i campi updated_at per ordinare prima dei campi created_at. Quindi, se i dati si presenta come:

id created_at updated_at 
-- ---------- ---------- 
1 2009-01-08 null 
2 2009-09-08 null 
3 2009-07-02 null 
4 2009-09-05 2009-09-06 
5 2009-04-01 null 
6 2009-09-07 2009-09-08 

vorrei risultati come:

id created_at updated_at 
-- ---------- ---------- 
6 2009-09-07 2009-09-08 
4 2009-09-05 2009-09-06 
2 2009-09-08 null 
3 2009-07-02 null 
5 2009-04-01 null 
1 2009-01-08 null 
+0

Aggiornato la mia risposta in base all'aggiornamento. –

risposta

17

sembra che stai cercando:

ORDER BY COALESCE(updated_at, created_at) 

per the docs, coalesce rendimenti

una copia del primo n argomento on-NULL. Se tutti gli argomenti sono NULL, allora NULL è restituito . Ci devono essere almeno 2 argomenti .

Edit: data di modifica del PO, egli può invece voler:

ORDER BY COALESCE(updated_at, '1929-9-9') DESC, created_at DESC 

o simili trucchi per disc Ordinamento; o forse

ORDER BY MAX(COALESCE(updated_at, '1929-9-9'), created_at) DESC 

è impossibile dire esattamente ciò che il PO vuole da un esempio unico e molto particolare, ma una variante su qualcuno di questi approcci dovrebbe risolvere il suo problema effettivo, a prescindere che il problema può effettivamente essere in specifico, dettaglio preciso e completo.

3

IFNULL, vedere here

In questo caso devi usare qualcosa di simile a:

IFNULL (updated_at, '1-Jan-2100'), created_at

Tutte le colonne senza un campo updated_at sarebbe dato l'ordinamento di default e sarebbe quindi ordinare per created_at. Il valore di 1-gennaio-2100 garantisce che compaiano per ultimi nell'elenco. Cambia questo per essere 1900 se li vuoi prima.

+0

Grazie, è stato super utile, ma non era proprio quello che stavo cercando perché ho formulato la mia domanda male. Modificato. –

0

So che questo non risponde esattamente alla tua domanda, ma è una soluzione alternativa.

Se si dovesse impostare il campo updated_at per lo stesso created_at sulla creazione, si dovrebbe sempre avere un valore per updated_at e può sempre e solo ordina per il campo updated_at.Per una piccola quantità di duplicazione, semplifichi il tuo codice, la tua vita e l'efficienza delle tue query SQL.