¿Ordenar por columna ASC, pero primero con valores NULL?
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_updated
vengan antes que no nulos last_updated
.
es posible?
order by last_updated asc -- and null last_updated records first ??
Postgres tiene los NULLS FIRST | LAST
modificadores de ORDER BY
expresió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 NULL
los 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 NULL
se 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
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;