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).