Trier les valeurs NULL à la fin d'une table

95

Existe-t-il un moyen avec PostgreSQL de trier les lignes avec des NULLvaleurs dans les champs jusqu'à la fin de la table sélectionnée?

Comme:

SELECT * FROM table ORDER BY somevalue, PUT_NULL_TO_END
helle
la source

Réponses:

171

Tout d'abord, les valeurs NULL sont triées en dernier dans l' ordre croissant par défaut . Vous n'avez rien à faire de plus.

Le problème s'applique à l' ordre décroissant , qui est l'inverse parfait et trie donc d'abord les valeurs NULL. La solution indiquée par @Mosty a été introduite avec PostgreSQL 8.3 :

ORDER BY somevalue DESC NULLS LAST

Pour PostgreSQL 8.2 et versions antérieures ou d'autres SGBDR sans cette fonctionnalité SQL standard, vous pouvez remplacer:

ORDER BY (somevalue IS NULL), somevalue DESC

FALSEtrie avant TRUE, donc les valeurs NULL viennent en dernier, tout comme dans l'exemple ci-dessus.

Réponse ultérieure connexe:

Erwin Brandstetter
la source
2
IMHO dans la plupart des applications du monde réel, vous voudriez que les valeurs nulles durent quel que soit l'ordre. Par exemple, trier DESC sur un horodatage facultatif, prénom, nom, ... donc je trouve cela vraiment suspect même s'il semble logique que l'ordre DESC soit mathématiquement le contraire de ASC. Peut-être que les valeurs nulles doivent simplement être dans une catégorie à part et ne devraient pas être affectées par ASC, DESC et toujours mises en dernier, cela aurait été une meilleure valeur par défaut.
Christophe Roussy
Cela pourrait affecter les index s'ils sont DESC. Peut-être pourriez-vous ajouter une note à ce sujet aussi? postgresql.org/message-id/…
Christophe Roussy
@ChristopheRoussy: Les index correspondant à l'ordre de tri sont touchés dans la réponse liée ci-dessus.
Erwin Brandstetter
3
Personnellement, je pense que la valeur par défaut aurait dû être le contraire: les NULL viennent en premier dans l'ordre croissant et en dernier dans l'ordre décroissant. C'est beaucoup plus intuitif, car NULL est la "plus petite" valeur.
Stephen
1
Pour les personnes venant de MYSQL, c'est un lol? Pourquoi a-t-il été construit comme ça en premier lieu? OU Mysql a-t-il trop optimisé le résultat
CodeGuru