2009-09-09 25 views
6

Tengo una tabla simple, algo así como: int id, date created_at, date updated_at. Me gustaría ordenar las filas para que las filas que tienen un updated_at se ordenan por eso, y las que no se ordenarán por el created_at. El problema es que algo así como:Ordenar por varios campos en SQLite

SELECT * FROM table ORDER BY updated_at, created_at 

no funciona. He estado buscando en las cláusulas orden de encargo, algo así como:

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

pero parece que no puede conseguir cualquier cosa que trabajar. Ayuda?

EDIT: debería haber especificado que quiero updated_at los campos para ordenar antes de las created_at campos. Por lo tanto, si los datos se parece a:

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 

me gustaría resultados como:

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

Actualicé mi respuesta en función de su actualización. –

Respuesta

17

Parece que estás buscando:

ORDER BY COALESCE(updated_at, created_at) 

por the docs, coalesce vuelve

una copia de la primera n argumento on-NULL Si todos los argumentos son NULL, se devuelve NULL . Debe haber al menos 2 argumentos.

Editar: dada de edición de la OP, que puede en lugar de desear:

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

o similares trucos para ordenar DESC; o tal vez

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

que es imposible predecir con exactitud lo que el PO quiere de un sencillo y muy peculiar ejemplo, pero una variante de alguno de estos enfoques debe resolver su problema real, lo que ese problema puede ser en realidad en concreto, preciso y completo detalle.

3

IFNULL, ver here

En este caso tendrá que utilizar algo como:

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

Todas las columnas sin un campo updated_at recibiría el orden de clasificación predeterminado y luego ordenaría por created_at. El valor de 1-enero-2100 asegura que aparecen últimos en la lista. Cambie esto para ser 1900 si los quiere primero.

+0

Gracias, eso fue muy útil, pero no era exactamente lo que estaba buscando porque formulé mi pregunta mal. Editado –

0

Sé que esto no responde exactamente a su pregunta, pero es una solución alternativa.

Si se va a establecer el campo updated_at a los mismos que created_at en la creación, que siempre tendría un valor de updated_at y siempre se puede simplemente ordenar por el campo updated_at.Por una cantidad menor de duplicación, simplificará su código, su vida y la eficiencia de sus consultas sql.

Cuestiones relacionadas