Problem:
Du vill sortera raderna efter datum.
Exempel 1:
exam
Tabellen har två kolumner, subject
och exam_date
.
ämne | exam_date |
---|---|
Matematik | 2019-12-19 |
Engelska | 2020-01-08 |
Vetenskap | 2020-01-05 |
Hälsa | 2020-01-05 |
Konst | NULL |
Du vill sortera raderna efter exam_date
.
Lösning:
SELECT * FROM exam ORDER BY exam_date;
Resultatet ser ut så här (raderna är sorterade i stigande ordning efter exam_date
):
Ämne | ExamDate |
---|---|
Konst | NULL |
Matematik | 2019-12-19 |
Vetenskap | 2020-01-05 |
Hälsa | 2020-01-05 |
Engelska | 2020-01-08 |
Diskussion:
Använd ORDER BY
nyckelord och namnet på den kolumn som du vill sortera efter. På så sätt kommer du att sortera data i stigande ordning efter den här kolumnen. Du kan också använda ASC
nyckelord för att göra det tydligt att ordningen stiger (det tidigaste datumet visas först, det senaste datumet visas sist, etc.).
SELECT * FROM exam ORDER BY exam_date ASC;
Om du vill se det senaste datumet först och det tidigaste datumet sist måste du sortera i fallande ordning. Använd DESC
nyckelord i det här fallet.
SELECT * FROM exam ORDER BY exam_date DESC;
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 exam_date
visas i slumpmässig ordning (du kan se Science
andra och Health
tredje, eller Health
andra och Science
tredje).
Exempel 2:
exam
Tabellen har följande kolumner:subject
, exam_year
, exam_month
och exam_day
. Månaderna anges i namn, inte i siffror.
ämne | examensår | exam_month | exam_day |
---|---|---|---|
Matematik | 2019 | December | 19 |
Engelska | 2020 | Januari | 8 |
Vetenskap | 2020 | Januari | 5 |
Hälsa | 2020 | Januari | 5 |
Konst | NULL | NULL | NULL |
Lösning:
SELECT * FROM exam ORDER BY exam_year, (CASE exam_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), exam_day;
Resultatet ser ut så här (raderna är sorterade i stigande ordning efter exam_year
, exam_month
och exam_day
):
ämne | examensår | exam_month | exam_day |
---|---|---|---|
Konst | NULL | NULL | NULL |
Matematik | 2019 | December | 19 |
Hälsa | 2020 | Januari | 5 |
Vetenskap | 2020 | Januari | 5 |
Engelska | 2020 | Januari | 8 |
Diskussion:
För att sortera raderna efter examensdatum måste du först sortera efter år, sedan efter numerisk månad (inte månadsnamn) och slutligen efter dag. Du kan konvertera månadsnamn till numeriska månader med en CASE WHEN
klausul. Efter CASE
nyckelord, ange namnet på kolumnen. Sedan, efter varje NÄR, ange värdet i den här kolumnen, använd sökordet THEN och ange det nya värdet du vill tilldela istället för det gamla. Här är kolumnen exam_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 exam_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 när du sorterar raderna efter datum, det vill säga efter år, numerisk månad och dag.
ORDER BY exam_year, (CASE exam_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), exam_day
På så sätt kan du sortera raderna i stigande ordning efter datum. NULL
s kommer att visas först. För att ändra ordningen till fallande, använd DESC
nyckelord efter varje kolumn i ORDER BY
klausul. Så här ska hela frågan se ut:
SELECT * FROM exam ORDER BY exam_year DESC, (CASE exam_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, exam_day DESC;
Observera att när du sorterar i fallande ordning i SQLite, NULL
s visas sist.