Problem:
Chcesz posortować wiersze według daty.
Przykład 1:
exam
tabela ma dwie kolumny, subject
i exam_date
.
temat | data_egzaminu |
---|---|
Matematyka | 2019-12-19 |
angielski | 2020-01-08 |
Nauka | 2020-01-05 |
Zdrowie | 2020-01-05 |
Sztuka | NULL |
Chcesz posortować wiersze według exam_date
.
Rozwiązanie:
SELECT * FROM exam ORDER BY exam_date;
Wynik wygląda tak (wiersze są sortowane w porządku rosnącym według exam_date
):
Temat | Data egzaminu |
---|---|
Sztuka | NULL |
Matematyka | 2019-12-19 |
Nauka | 2020-01-05 |
Zdrowie | 2020-01-05 |
angielski | 2020-01-08 |
Dyskusja:
Użyj ORDER BY
słowo kluczowe i nazwę kolumny, według której chcesz sortować. W ten sposób posortujesz dane w kolejności rosnącej według tej kolumny. Możesz także użyć ASC
słowo kluczowe, aby było jasne, że kolejność rośnie (najwcześniejsza data jest wyświetlana jako pierwsza, najnowsza data jest wyświetlana jako ostatnia itd.).
SELECT * FROM exam ORDER BY exam_date ASC;
Jeśli chcesz, aby najnowsza data była widoczna jako pierwsza, a najwcześniejsza jako ostatnia, musisz posortować dane w kolejności malejącej. Użyj DESC
w tym przypadku słowo kluczowe.
SELECT * FROM exam ORDER BY exam_date DESC;
Zauważ, że w SQLite, NULL
s są wyświetlane jako pierwsze przy sortowaniu w porządku rosnącym i jako ostatnie przy sortowaniu w porządku malejącym. Ponadto wiersze z tą samą exam_date
są wyświetlane w losowej kolejności (możesz zobaczyć Science
drugi i Health
trzeci lub Health
drugi i Science
trzeci).
Przykład 2:
exam
tabela ma następujące kolumny:subject
, exam_year
, exam_month
i exam_day
. Miesiące podane są w imionach, a nie w liczbach.
temat | rok_egzaminacyjny | egzamin_miesiąc | dzień_egzaminacyjny |
---|---|---|---|
Matematyka | 2019 | grudzień | 19 |
angielski | 2020 | Styczeń | 8 |
Nauka | 2020 | Styczeń | 5 |
Zdrowie | 2020 | Styczeń | 5 |
Sztuka | NULL | NULL | NULL |
Rozwiązanie:
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;
Wynik wygląda tak (wiersze są posortowane w porządku rosnącym według exam_year
, exam_month
i exam_day
):
temat | rok_egzaminacyjny | egzamin_miesiąc | dzień_egzaminacyjny |
---|---|---|---|
Sztuka | NULL | NULL | NULL |
Matematyka | 2019 | grudzień | 19 |
Zdrowie | 2020 | Styczeń | 5 |
Nauka | 2020 | Styczeń | 5 |
angielski | 2020 | Styczeń | 8 |
Dyskusja:
Aby posortować wiersze według daty egzaminu, musisz najpierw posortować według roku, następnie według liczbowego miesiąca (nie nazwy miesiąca), a na końcu według dnia. Możesz przekonwertować nazwy miesięcy na miesiące liczbowe za pomocą CASE WHEN
klauzula. Po CASE
słowo kluczowe, określ nazwę kolumny. Następnie po każdym WHEN podaj wartość w tej kolumnie, użyj słowa kluczowego THEN i określ nową wartość, którą chcesz przypisać zamiast starej. Tutaj kolumna to exam_month
, bieżące wartości w tej kolumnie to „January
', 'February
', …, 'December
', a nowe wartości to miesiące liczbowe 1
, 2
, …, 12
. Po zakończeniu konwersji wszystkich wartości pamiętaj, aby użyć END
słowo kluczowe do zamknięcia CASE WHEN
klauzula. Spójrz:
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
W ten sposób przekonwertujesz nazwę miesiąca na numer miesiąca. Możesz go użyć podczas sortowania wierszy według daty, to znaczy według roku, miesiąca numerycznego i dnia.
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
W ten sposób możesz sortować wiersze w porządku rosnącym według daty. NULL
s zostanie wyświetlone jako pierwsze. Aby zmienić kolejność na malejącą, użyj DESC
słowo kluczowe po każdej kolumnie w ORDER BY
klauzula. Oto jak powinno wyglądać całe zapytanie:
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;
Zwróć uwagę, że podczas sortowania w kolejności malejącej w SQLite, NULL
s są wyświetlane jako ostatnie.