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.