SQLite
 sql >> Base de données >  >> RDS >> SQLite

Comment commander par nom de mois dans SQLite

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;