Problem:
Du vill sortera raderna efter månadsnummer, givna månadsnamn (du vill att januari ska visas först, december sista).
Exempel:
birthday
Tabellen innehåller två kolumner:namn och birthday_month
. Månaderna anges i namn, inte i siffror.
namn | födelsedag_månad |
---|---|
Ronan Tisha | Januari |
December | April |
Angie Julia | April |
Narelle Dillan | April |
Purdie Casey | Januari |
Donna Nell | NULL |
Blaze Graeme | Oktober |
Du vill sortera raderna efter birthday_month
.
Lösning:
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);
Resultatet ser ut så här (raderna är sorterade i stigande ordning efter birthday_month
):
namn | födelsedag_månad |
---|---|
Purdie Casey | Januari |
Angie Julia | April |
Narelle Dillan | April |
Blaze Graeme | Oktober |
Ronan Tisha | Januari |
December | NULL |
Donna Nell | NULL |
Diskussion:
För att sortera raderna efter månad behöver du månaderna i siffror (inte namn). Du kan konvertera månadsnamn till numeriska månader med hjälp av CASE WHEN
klausul. Efter CASE
nyckelord, ange namnet på kolumnen. Sedan, efter varje WHEN
, ange värdet i den här kolumnen, använd THEN
nyckelord och ange det nya värdet du vill tilldela istället för det gamla. Här är kolumnen birthday_month
, de aktuella värdena i den här kolumnen är 'January
', 'February
', …, 'December
', och de nya värdena är de numeriska månaderna 1
, 2,
…, 12
. När du är klar med att konvertera alla värden, kom ihåg att använda END
nyckelord för att stänga CASE WHEN
klausul. Ta en titt:
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
Så här konverterar du ett månadsnamn till ett månadsnummer. Du kan använda den för att sortera raderna i stigande ordning efter månad – använd den bara i ORDER BY
klausul.
Observera att i SQLite, NULL
s visas först vid sortering i stigande ordning och sist vid sortering i fallande ordning. Dessutom raderna med samma birthday_month
visas i slumpmässig ordning (du kan se Angie Julia
andra och Narelle Dillan
tredje, eller Narelle Dillan
andra och Angie Julia
tredje). För att ändra ordningen till fallande, använd DESC
nyckelord efter kolumnen i ORDER BY
klausul. Så här ska frågan se ut:
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;