Problem:
Chcesz posortować wiersze według numeru miesiąca, podanych nazw miesięcy (chcesz, aby styczeń był wyświetlany jako pierwszy, grudzień jako ostatni).
Przykład:
birthday
tabela zawiera dwie kolumny:imię i nazwisko oraz birthday_month
. Miesiące podane są w imionach, a nie w liczbach.
nazwa | birthday_month |
---|---|
Ronan Tisha | Styczeń |
Grudzień | Kwiecień |
Angie Julia | Kwiecień |
Narelle Dillan | Kwiecień |
Purdie Casey | Styczeń |
Donna Nell | NULL |
Blaze Graeme | październik |
Chcesz posortować wiersze według birthday_month
.
Rozwiązanie:
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);
Wynik wygląda tak (wiersze są posortowane w porządku rosnącym według birthday_month
):
nazwa | birthday_month |
---|---|
Purdie Casey | Styczeń |
Angie Julia | Kwiecień |
Narelle Dillan | Kwiecień |
Blaze Graeme | październik |
Ronan Tisza | Styczeń |
Grudzień | NULL |
Donna Nell | NULL |
Dyskusja:
Aby posortować wiersze według miesięcy, potrzebujesz miesięcy w liczbach (nie nazwach). Możesz przekonwertować nazwy miesięcy na miesiące liczbowe, używając 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 THEN
słowa kluczowego i określ nową wartość, którą chcesz przypisać zamiast starej. Tutaj kolumna to birthday_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 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
W ten sposób przekonwertujesz nazwę miesiąca na numer miesiąca. Możesz go użyć do posortowania wierszy w kolejności rosnącej według miesiąca – po prostu użyj go w ORDER BY
klauzula.
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 tym samym birthday_month
są wyświetlane w losowej kolejności (możesz zobaczyć Angie Julia
drugi i Narelle Dillan
trzeci lub Narelle Dillan
drugi i Angie Julia
trzeci). Aby zmienić kolejność na malejącą, użyj DESC
słowo kluczowe po kolumnie w ORDER BY
klauzula. Oto jak powinno wyglądać zapytanie:
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;