Tri des valeurs avec des cas particuliers dans PostgreSQL
Cette discussion est centrée sur l'organisation des données d'une table PostgreSQL nommée « tâches ». Chaque tâche comporte un champ facultatif appelé « tri ». L'objectif est de donner la priorité aux tâches de tri sans valeurs de « tri » après toutes les autres, à l'exception de celles avec « -1 » comme valeur de tri, qui doivent apparaître après toutes les autres.
Considérez les exemples de données suivants :
id | f_id | name | sort |
---|---|---|---|
1 | 1 | zeta | -1 |
2 | 1 | alpha | 1 |
3 | 1 | gamma | 3 |
4 | 1 | beta | 2 |
5 | 1 | delta | |
6 | 1 | epsilon |
L'utilisation de COALESCE(sort,99999) seule regroupera les valeurs nulles après les valeurs non nulles, mais cela ne traitera pas le cas particulier de "-1."
La solution utilise le type de données booléen de PostgreSQL pour obtenir l'ordre de tri souhaité :
SELECT * FROM tasks ORDER BY (sort IS NOT DISTINCT FROM -1), sort;
Cette requête profite du fait que la comparaison "(le tri N'EST PAS DISTINCT FROM -1)" est évalué à FALSE pour toutes les valeurs sauf "-1", qui lui-même est évalué à TRUE. En triant d'abord par cette expression, les valeurs "-1" sont placées à la fin de la commande, quelles que soient leurs valeurs de tri.
Une approche alternative, utilisant le mot-clé DESC, est également présentée :
SELECT * FROM tasks ORDER BY (sort IS DISTINCT FROM -1) DESC, sort;
Les deux méthodes trient efficacement les tâches sans valeurs de « tri » après toutes les autres, tout en garantissant que les valeurs « -1 » apparaissent après toutes les autres valeurs de tri non nulles.
Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!