¿Ordenar por columna ASC, pero primero con valores NULL?

Resuelto mhd asked hace 12 años • 2 respuestas

Necesito ordenar una tabla PostgreSQL de forma ascendente por un campo de fecha/hora, por ejemplo last_updated.

Pero ese campo puede estar vacío o nulo y quiero que los registros con entrada nula last_updatedvengan antes que no nulos last_updated.
es posible?

order by last_updated asc  -- and null last_updated records first ??
mhd avatar Mar 01 '12 11:03 mhd
Aceptado

Postgres tiene los NULLS FIRST | LASTmodificadores de ORDER BYexpresión:

... ORDER BY last_updated NULLS FIRST

El caso de uso típico es con orden descendente ( DESC), lo que produce la inversión completa del orden ascendente predeterminado ( ASC) con valores nulos primero, lo que a menudo no es deseable. Para ordenar NULLlos valores al final:

... ORDER BY last_updated DESC NULLS LAST

Para respaldar la consulta con un índice , haga que coincida:

CREATE INDEX foo_idx ON tbl (last_updated DESC NULLS LAST);

Postgres puede leer los índices btree al revés, por lo que en realidad es casi lo mismo que:

CREATE INDEX foo_idx ON tbl (last_updated);

Para algunos planes de consulta, es importante dónde NULLse agregan los valores. Ver:

  • Impacto en el rendimiento de la vista en la función agregada frente a la limitación del conjunto de resultados
Erwin Brandstetter avatar Mar 01 '2012 06:03 Erwin Brandstetter

Puede crear un ORDER BY personalizado utilizando una declaración CASE.
La declaración CASE verifica su condición y asigna a las filas que cumplen esa condición un valor menor que el asignado a las filas que no cumplen la condición.
Probablemente sea más fácil de entender con un ejemplo:

  SELECT last_updated 
    FROM your_table 
ORDER BY CASE WHEN last_updated IS NULL THEN 0 ELSE 1 END, 
         last_updated ASC;
mechanical_meat avatar Mar 01 '2012 04:03 mechanical_meat