Problème :
Vous souhaitez trier les lignes par numéro de mois, en fonction des noms de mois (vous souhaitez que janvier s'affiche en premier, décembre en dernier).
Exemple :
Le birthday
le tableau contient deux colonnes :nom et birthday_month
. Les mois sont donnés en noms, pas en nombres.
nom | anniversaire_mois |
---|---|
Ronan Tisha | Janvier |
Décembre | Avril |
Angie Julia | Avril |
Narelle Dillan | Avril |
Purdie Casey | Janvier |
Donna Nell | NULL |
Blaze Graeme | Octobre |
Vous souhaitez trier les lignes par birthday_month
.
Solution :
SELECT * FROM birthday ORDER BY (CASE birthday_month WHEN 'January' THEN 1 WHEN 'February' THEN 2 WHEN 'March' THEN 3 WHEN 'April' THEN 4 WHEN 'May' THEN 5 WHEN 'June' THEN 6 WHEN 'July' THEN 7 WHEN 'August' THEN 8 WHEN 'September' THEN 9 WHEN 'October' THEN 10 WHEN 'November' THEN 11 WHEN 'December' THEN 12 END);
Le résultat ressemble à ceci (les lignes sont triées par ordre croissant de birthday_month
):
nom | anniversaire_mois |
---|---|
Purdie Casey | Janvier |
Angie Julia | Avril |
Narelle Dillan | Avril |
Blaze Graeme | Octobre |
Ronan Tisha | Janvier |
Décembre | NULL |
Donna Nell | NULL |
Discussion :
Pour trier les lignes par mois, vous avez besoin des mois en chiffres (et non en noms). Vous pouvez convertir les noms de mois en mois numériques en utilisant le CASE WHEN
clause. Après le CASE
mot-clé, indiquez le nom de la colonne. Puis, après chaque WHEN
, indiquez la valeur dans cette colonne, utilisez le THEN
mot-clé et spécifiez la nouvelle valeur que vous souhaitez attribuer à la place de l'ancienne. Ici, la colonne est birthday_month
, les valeurs actuelles de cette colonne sont 'January
', 'February
', …, 'December
', et les nouvelles valeurs sont les mois numériques 1
, 2,
…, 12
. Après avoir fini de convertir toutes les valeurs, n'oubliez pas d'utiliser le END
mot clé pour fermer le CASE WHEN
clause. Jetez un œil :
CASE birthday_month WHEN 'January' THEN 1 WHEN 'February' THEN 2 WHEN 'March' THEN 3 WHEN 'April' THEN 4 WHEN 'May' THEN 5 WHEN 'June' THEN 6 WHEN 'July' THEN 7 WHEN 'August' THEN 8 WHEN 'September' THEN 9 WHEN 'October' THEN 10 WHEN 'November' THEN 11 WHEN 'December' THEN 12 END
C'est ainsi que vous convertissez un nom de mois en un numéro de mois. Vous pouvez l'utiliser pour trier les lignes par ordre croissant par mois - utilisez-le simplement dans le ORDER BY
clause.
Notez que dans SQLite, NULL
s sont affichés en premier lors d'un tri par ordre croissant et en dernier lors d'un tri par ordre décroissant. Aussi, les lignes avec le même birthday_month
sont affichés dans un ordre aléatoire (vous pouvez voir Angie Julia
deuxième et Narelle Dillan
troisième, ou Narelle Dillan
deuxième et Angie Julia
troisième). Pour changer l'ordre en décroissant, utilisez le DESC
mot-clé après la colonne dans le ORDER BY
clause. Voici à quoi devrait ressembler la requête :
SELECT * FROM birthday ORDER BY (CASE birthday_month WHEN 'January' THEN 1 WHEN 'February' THEN 2 WHEN 'March' THEN 3 WHEN 'April' THEN 4 WHEN 'May' THEN 5 WHEN 'June' THEN 6 WHEN 'July' THEN 7 WHEN 'August' THEN 8 WHEN 'September' THEN 9 WHEN 'October' THEN 10 WHEN 'November' THEN 11 WHEN 'December' THEN 12 END) DESC;