Ordenar valores NULL al final de una tabla

95

¿Hay alguna forma con PostgreSQL para ordenar filas con NULLvalores en campos hasta el final de la tabla seleccionada?

Me gusta:

SELECT * FROM table ORDER BY somevalue, PUT_NULL_TO_END
helle
fuente

Respuestas:

171

En primer lugar, los valores NULL se ordenan en último lugar en orden ascendente predeterminado . No tienes que hacer nada adicional.

El problema se aplica al orden descendente , que es el inverso perfecto y, por lo tanto, ordena los valores NULL primero. La solución que señaló @Mosty se introdujo con PostgreSQL 8.3 :

ORDER BY somevalue DESC NULLS LAST

Para PostgreSQL 8.2 y anteriores u otros RDBMS sin esta característica estándar de SQL, puede sustituir:

ORDER BY (somevalue IS NULL), somevalue DESC

FALSEordena antes TRUE, por lo que los valores NULL ocupan el último lugar, como en el ejemplo anterior.

Respuesta posterior relacionada:

Erwin Brandstetter
fuente
2
En mi humilde opinión, en la mayoría de las aplicaciones del mundo real, querrá que los valores nulos duren en cualquier orden. Por ejemplo, ordenar DESC en una marca de tiempo opcional, nombre, apellido, ... así que lo encuentro realmente sospechoso, aunque parece tener sentido que matemáticamente el orden DESC es lo opuesto a ASC. Tal vez los nulos sean solo para estar en una categoría propia y no deberían verse afectados por ASC, DESC y siempre en último lugar, eso habría sido un mejor valor predeterminado.
Christophe Roussy
Podría afectar los índices si son DESC, ¿tal vez podría agregar una nota sobre eso también? postgresql.org/message-id/…
Christophe Roussy
@ChristopheRoussy: los índices que coinciden con el orden de clasificación se tocan en la respuesta vinculada arriba.
Erwin Brandstetter
3
Personalmente, creo que el valor predeterminado debería haber sido lo opuesto: los valores NULL vienen primero en orden ascendente y los últimos en orden descendente. Eso es mucho más intuitivo, ya que NULL es el valor "más pequeño".
Stephen
1
Para las personas que vienen de MYSQL, esto es un lol? ¿Por qué se construyó así en primer lugar? O ¿Mysql optimizó demasiado el resultado
CodeGuru