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 | NULL |
Grudzień | Styczeń |
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 EXTRACT(MONTH FROM TO_DATE(birthday_month, 'Month'));
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ąca od stycznia do grudnia, musisz przekonwertować miesiąc na liczbę („January
' do 1, 'February
' do 2
itp.). W przeciwnym razie zobaczysz „December
' przed 'January
„. Funkcja TO_DATE(birthday_month, 'Month') konwertuje pełną nazwę miesiąca na datę w '0001-MM-01
format. Na przykład otrzymasz „0001-12-01
' na grudzień.
Możesz teraz użyć funkcji EXTRACT(MIESIĄC OD daty), aby wyodrębnić miesiąc z tej wartości daty. Miesiąc będzie liczbą od 1
i 12
.
Łącząc te dwie funkcje, możesz otrzymać miesiąc jako liczbę za pomocą następującego wzoru:
EXTRACT(MONTH FROM TO_DATE(birthday_month, 'Month'))
Umieść to wyrażenie po ORDER BY
aby posortować wiersze według miesięcy. Jeśli chcesz najpierw zobaczyć ostatni miesiąc, musisz posortować dane w kolejności malejącej. Aby to zrobić, musisz użyć DESC
słowo kluczowe, takie jak:
SELECT * FROM birthday ORDER BY EXTRACT(MONTH FROM TO_DATE(birthday_month, 'Month')) DESC;
Zauważ, że w PostgreSQL i Oracle NULL
s są wyświetlane jako ostatnie przy sortowaniu w porządku rosnącym i jako pierwsze 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).