Oracle
 sql >> Datenbank >  >> RDS >> Oracle

So bestellen Sie nach Monatsnamen in PostgreSQL oder Oracle

Problem:

Sie möchten die Zeilen nach Monatsnummer und gegebenen Monatsnamen sortieren (Januar soll zuerst angezeigt werden, Dezember zuletzt).

Beispiel:

Der birthday Tabelle enthält zwei Spalten:name und birthday_month . Die Monate werden in Namen angegeben, nicht in Zahlen.

name Geburtstagsmonat
Ronan Tisha NULL
Dezember Januar
Angie Julia April
Narelle Dillan April
Purdie Casey Januar
Donna Nell NULL
Blaze Graeme Oktober

Sie möchten die Zeilen nach birthday_month sortieren .

Lösung:

SELECT *
FROM birthday
ORDER BY EXTRACT(MONTH FROM TO_DATE(birthday_month, 'Month'));

Das Ergebnis sieht so aus (die Zeilen sind in aufsteigender Reihenfolge nach birthday_month sortiert ):

name Geburtstagsmonat
Purdie Casey Januar
Angie Julia April
Narelle Dillan April
Blaze Graeme Oktober
Ronan Tisha Januar
Dezember NULL
Donna Nell NULL

Diskussion:

Um die Zeilen nach Monat beginnend mit Januar und endend mit Dezember zu sortieren, müssen Sie den Monat in eine Zahl umwandeln ('January ' bis 1, 'February ' zu 2 , etc.). Andernfalls würden Sie „December sehen ' vor 'January '. Die Funktion TO_DATE(birthday_month, 'Month') konvertiert einen vollständigen Monatsnamen in ein Datum im '0001-MM-01 ' Format. Sie erhalten beispielsweise „0001-12-01 ' für Dezember.

Sie können jetzt die Funktion EXTRACT(MONTH FROM date) verwenden, um den Monat aus diesem Datumswert zu extrahieren. Der Monat ist eine Zahl zwischen 1 und 12 .

Wenn Sie diese beiden Funktionen kombinieren, können Sie den Monat als Zahl mit der folgenden Formel erhalten:

EXTRACT(MONTH FROM TO_DATE(birthday_month, 'Month'))

Setzen Sie diesen Ausdruck nach ORDER BY um die Zeilen nach Monat zu sortieren. Wenn Sie den neuesten Monat zuerst sehen möchten, müssen Sie in absteigender Reihenfolge sortieren. Dazu müssen Sie einen DESC verwenden Schlüsselwort, etwa so:

SELECT *
FROM birthday
ORDER BY EXTRACT(MONTH FROM TO_DATE(birthday_month, 'Month')) DESC;

Beachten Sie, dass in PostgreSQL und Oracle NULL s werden bei aufsteigender Sortierung zuletzt und bei absteigender Sortierung zuerst angezeigt. Auch die Zeilen mit demselben birthday_month werden in zufälliger Reihenfolge angezeigt (möglicherweise sehen Sie Angie Julia zweitens und Narelle Dillan drittens oder Narelle Dillan zweitens und Angie Julia Dritter).