2008-09-29 11 views
48

Tengo un montón de tareas en una base de datos MySQL, y uno de los campos es "fecha límite". No todas las tareas tienen que tener una fecha límite.Posible usar SQL para ordenar por fecha pero poner fechas nulas en la parte posterior del conjunto de resultados?

Me gustaría utilizar SQL para ordenar las tareas por fecha de vencimiento, pero pongo las que no tienen una fecha límite en la parte posterior del conjunto de resultados. Como está ahora, las fechas nulas aparecen primero, luego el resto se ordena por fecha de plazo más temprano a más reciente.

¿Alguna idea sobre cómo hacer esto con SQL solo? (Puedo hacerlo con PHP si es necesario, pero una solución solo SQL sería genial.)

¡Gracias!

Respuesta

62

Aquí hay una solución utilizando sólo SQL estándar, no IsNull(). Esa función no es SQL estándar, y puede no funcionar en otras marcas de RDBMS.

SELECT * FROM myTable 
WHERE ... 
ORDER BY CASE WHEN myDate IS NULL THEN 1 ELSE 0 END, myDate; 
+0

+1. Aquí hay otra solución estándar elegante y compacta (disponible desde [SQL: extensión 2003 T611] (http://en.wikipedia.org/wiki/Order_by), aunque no todos los proveedores implementan esta funcionalidad): http://stackoverflow.com/ a/12767777/814702. – informatik01

+1

@ informatik01, buen consejo, pero esta pregunta está etiquetada como 'mysql' y MySQL no admite esa sintaxis. –

+0

@BillKarwin Sí, triste. Solo comprobé esto en PostgreSQL 9.1, donde funciona muy bien. De todas formas, deja que esta información esté aquí solo para completar. PD Recién noté que al usar 'ORDER BY' MySQL y PostgreSQL se comportan de manera diferente: al ordenar * ascendente * MySQL pone los valores NULL ** primero **, mientras que PostgreSQL pone los valores NULL ** último **. Bueno, algo específico del proveedor ... – informatik01

4
SELECT foo, bar, due_date FROM tablename 
ORDER BY CASE ISNULL(due_date, 0) 
WHEN 0 THEN 1 ELSE 0 END, due_date 

Así que usted tiene 2 órdenes por cláusulas. La primera pone todos los no nulos en la parte delantera, a continuación, ordena por fecha de vencimiento después de eso

+0

"case isnull (due_date, 0) when 0 then 1 else 0" - why moleste doing all that? isnull devuelve 1 o 0 de todos modos. – nickf

+0

En MSSQL, ISNULL devuelve su primer argumento, o su segundo argumento si su primer argumento es nulo. Hay una función SQL estándar COALESCE que hace lo mismo y también acepta más de dos argumentos. Pero esto está un poco fuera de tema ya que el póster pregunta por MySQL ... – Stewart

28
SELECT * FROM myTable 
WHERE ... 
ORDER BY ISNULL(myDate), myDate 
+0

ISNULL requiere 2 argumentos en SQL Server. ¿MySQL solo requiere uno? – Codewerks

+3

sí - solo uno. http://dev.mysql.com/doc/refman/5.0/en/comparison-operators.html#function_isnull – nickf

+0

Tenga en cuenta que, en el caso de Access/VBA, 'True

Cuestiones relacionadas