Problem:
Du vil sortere rækkerne efter månedsnummer, givet månedsnavne (du ønsker, at januar skal vises først, december sidste).
Eksempel:
birthday
tabel indeholder to kolonner:navn og birthday_month
. Månederne er angivet i navne, ikke i tal.
navn | fødselsdag_måned |
---|---|
Ronan Tisha | NULL |
December | Januar |
Angie Julia | April |
Narelle Dillan | April |
Purdie Casey | Januar |
Donna Nell | NULL |
Blaze Graeme | Oktober |
Du vil sortere rækkerne efter birthday_month
.
Løsning:
SELECT * FROM birthday ORDER BY EXTRACT(MONTH FROM TO_DATE(birthday_month, 'Month'));
Resultatet ser sådan ud (rækkerne er sorteret i stigende rækkefølge efter birthday_month
):
navn | fødselsdag_måned |
---|---|
Purdie Casey | Januar |
Angie Julia | April |
Narelle Dillan | April |
Blaze Graeme | Oktober |
Ronan Tisha | Januar |
December | NULL |
Donna Nell | NULL |
Diskussion:
For at sortere rækkerne efter måned fra januar til december, skal du konvertere måneden til et tal ('January
' til 1, 'February
' til 2
, etc.). Ellers vil du se 'December
' før 'January
'. Funktionen TO_DATE(fødselsdag_måned, 'Måned') konverterer et fuldt månedsnavn til en dato i '0001-MM-01
' format. For eksempel får du '0001-12-01
' for december.
Du kan nu bruge EXTRACT(MONTH FROM date)-funktionen til at udtrække måneden fra denne datoværdi. Måneden vil være et tal mellem 1
og 12
.
Ved at kombinere disse to funktioner kan du få måneden som et tal ved hjælp af følgende formel:
EXTRACT(MONTH FROM TO_DATE(birthday_month, 'Month'))
Sæt dette udtryk efter ORDER BY
at sortere rækkerne efter måned. Hvis du gerne vil se den seneste måned først, skal du sortere i faldende rækkefølge. For at gøre dette skal du bruge en DESC
søgeord som dette:
SELECT * FROM birthday ORDER BY EXTRACT(MONTH FROM TO_DATE(birthday_month, 'Month')) DESC;
Bemærk, at NULL
i PostgreSQL og Oracle s vises sidst ved sortering i stigende rækkefølge og først ved sortering i faldende rækkefølge. Også rækkerne med den samme birthday_month
vises i tilfældig rækkefølge (du kan muligvis se Angie Julia
anden og Narelle Dillan
tredje, eller Narelle Dillan
anden og Angie Julia
tredje).