sql >> Databasteknik >  >> RDS >> Oracle

Hur man beställer efter månadsnamn i PostgreSQL eller Oracle

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


  1. Är det möjligt att utföra korsdatabasfrågor med PostgreSQL?

  2. Ansluter Google BigQuery till IRI Voracity Software

  3. Kör en dynamisk korstabellsfråga

  4. Vad är nytt i MySQL Galera Cluster 4.0