Problem:
Du vill sortera raderna efter månadsnummer, givna månadsnamn (du vill att januari ska visas först, december sista).
Exempel:
birthday
Tabellen innehåller två kolumner:namn och birthday_month
. Månaderna anges i namn, inte i siffror.
namn | födelsedag_månad |
---|---|
Ronan Tisha | NULL |
December | Januari |
Angie Julia | April |
Narelle Dillan | April |
Purdie Casey | Januari |
Donna Nell | NULL |
Blaze Graeme | Oktober |
Du vill sortera raderna efter birthday_month
.
Lösning:
SELECT * FROM birthday ORDER BY EXTRACT(MONTH FROM TO_DATE(birthday_month, 'Month'));
Resultatet ser ut så här (raderna är sorterade i stigande ordning efter birthday_month
):
namn | födelsedag_månad |
---|---|
Purdie Casey | Januari |
Angie Julia | April |
Narelle Dillan | April |
Blaze Graeme | Oktober |
Ronan Tisha | Januari |
December | NULL |
Donna Nell | NULL |
Diskussion:
För att sortera raderna efter månad med början från januari och slutar med december, måste du konvertera månaden till ett tal ('January
' till 1, 'February
' till 2
, etc.). Annars skulle du se 'December
' före 'January
'. Funktionen TO_DATE(birthday_month, 'Month') konverterar ett fullständigt månadsnamn till ett datum i '0001-MM-01
' format. Till exempel får du '0001-12-01
' för december.
Du kan nu använda EXTRACT(MONTH FROM date)-funktionen för att extrahera månaden från detta datumvärde. Månaden kommer att vara ett nummer mellan 1
och 12
.
Genom att kombinera dessa två funktioner kan du få månaden som ett tal med följande formel:
EXTRACT(MONTH FROM TO_DATE(birthday_month, 'Month'))
Sätt detta uttryck efter ORDER BY
för att sortera raderna efter månad. Om du vill se den senaste månaden först, måste du sortera i fallande ordning. För att göra detta måste du använda en DESC
nyckelord, så här:
SELECT * FROM birthday ORDER BY EXTRACT(MONTH FROM TO_DATE(birthday_month, 'Month')) DESC;
Observera att i PostgreSQL och Oracle, NULL
s visas sist vid sortering i stigande ordning och först vid sortering i fallande ordning. Dessutom raderna med samma birthday_month
visas i slumpmässig ordning (du kan se Angie Julia
andra och Narelle Dillan
tredje, eller Narelle Dillan
andra och Angie Julia
tredje).