lunes, 13 de junio de 2011

SQL SERVER - Ordenar datos de una columna, poniendo NULL al final

Digamos que se da el caso que tenemos una lista de tareas por realizar, algunas de las cuales no tienen fecha definida de culminación, por lo tanto se han guardado en la base de datos con fecha NULL.
Luego, imaginemos que tenemos que mostrar estas tareas en una grilla… si nosotros hacemos una consulta para obtener todas las tareas, y las ordenamos por fecha de culminación… veremos desagradablemente que las tareas con fecha NULL se mostrarán primero que las demás… lo cual nos hace recordar que un NULL siempre es menor que un dato no NULL… ejemplo:
SELECT [taskid],[userid],[title],[progress],[duedate]

FROM [dbo].[tm_task]

ORDER BY [duedate] ASC
sort_order_null_end 
Y lógicamente no es lo que quisieramos obtener como resultado:

si hay tareas sin fecha definida, estas deberían ir al último (puede ser que tú pienses lo contrario, pero no discutamos).

Entonces, para lograr que las tareas con fecha NULL vayan al final, hacemos uso de COALESCE, elcual nos permite utilizar otro valor si es que el dato es NULL, algo así:

SELECT [taskid],[userid],[title],[progress]
COALESCE([duedate], aqui_pones_una_fecha_con_un_valor_alto) AS [duedate]

FROM [dbo].[tm_task]

ORDER BY [duedate] ASC

Simple no es cierto?

Obviamente no sólo funciona para fechas, también lo puedes usar para números, cadenas, etc.

Espero que les sea de utilidad ;)

2 comentarios:

Sergio E. dijo...

Hola, interesante función, yo no la conocía, siendo que este problema lo resuelvo mediente el simple select case, ya que mi aplicacion debe correr en sql 2000 tambien.

select case CampoFecha when null then '3000/12/31' else CampoFecha end as CampoF

sin embargo agradezco la información y los diversos posts con los que nos iluminas.
Un abrazo desde México.

Segundo Serrano dijo...

Hola SergioE,

la función COALESCE también funciona en SQL SERVER 2000, además es recomendable usarla porque si más adelante vas a migrar tu bd a Oracle digamos, COALESCE también funcionará allí...

Saludos y gracias por tus palabras alentadoras.