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;