SQL-Abfrage, um alle Werte abzurufen, die eine Aufzählung haben kann

140

Postgresql hat vor einiger Zeit Enum-Unterstützung erhalten.

CREATE TYPE myenum AS ENUM (
'value1',
'value2',
);

Wie erhalte ich alle in der Aufzählung angegebenen Werte mit einer Abfrage?

Wienczny
quelle
Ich habe auch die folgende Antwort sehr hilfreich gefunden: stackoverflow.com/questions/9540681/list-postgres-enum-type
anonymer Feigling

Antworten:

264

Wenn Sie ein Array möchten:

SELECT enum_range(NULL::myenum)

Wenn Sie für jedes Element in der Aufzählung einen separaten Datensatz wünschen:

SELECT unnest(enum_range(NULL::myenum))  

zusätzliche Information

Diese Lösung funktioniert wie erwartet, auch wenn sich Ihre Aufzählung nicht im Standardschema befindet. Zum Beispiel ersetzen myenumdurch myschema.myenum.

Der Datentyp der zurückgegebenen Datensätze in der obigen Abfrage lautet myenum. Je nachdem, was Sie tun, müssen Sie möglicherweise in Text umwandeln. z.B

SELECT unnest(enum_range(NULL::myenum))::text

Wenn Sie den Spaltennamen angeben möchten, können Sie anhängen AS my_col_name.


Wir danken Justin Ohms für den Hinweis auf einige zusätzliche Tipps, die ich in meine Antwort aufgenommen habe.

Chris L.
quelle
1
Diese Antwort ist viel prägnanter. Schöner Beitrag!
Darin Peterson
3
Der unnest Aufruf ruft Datensätze vom Typ myenum mit dem Spaltennamen "myenum" zurück. Möglicherweise möchten Sie die Aufzählung auch in Text umwandeln und einen Spaltennamen angeben, indem Sie etwas wie hinzufügen. :: Text AS my_column
Justin Ohms
1
Um zu verstehen , mehr über ENUM - Funktionen können Sie diesen Link betrachten postgresql.org/docs/8.3/static/functions-enum.html postgresql.org/docs/9.2/static/functions-array.html
Bikal Basnet
1
Was bedeutet das NULL::?
Sung Cho
1
@ ChrisL danke. es scheint sehr seltsam. Warum können wir das nicht tun SELECT enum_range(myenum)? Was bedeutet Casting null?
Sung Cho
31

Versuchen:

SELECT e.enumlabel
  FROM pg_enum e
  JOIN pg_type t ON e.enumtypid = t.oid
  WHERE t.typname = 'myenum'
Kev
quelle
1
Wenn Sie dieselbe Aufzählung in mehr als einem Schema haben, muss diese möglicherweise etwas eingegrenzt werden. In diesem Fall finden Sie weitere Informationen unter postgresql.org/docs/current/static/catalog-pg-type.html .
Kev
1
Ich denke, Sie müssen 'myenum' mit einem Unterstrich voranstellen. Schauen Sie sich meine Antwort an, wenn Sie Aufzählungswerte benötigen und der Aufzählungsname in mehr als einem Schema verwendet werden kann.
David Underhill
Wenn die Aufzählungsreihenfolge wichtig ist, hängen Sie sie ORDER BY e.enumsortorderan die Abfrage an. Die aufgezählten Werte sind höchstwahrscheinlich nicht in der richtigen Reihenfolge, wenn neue Werte mit BEFOREoder in den Aufzählungstyp eingefügt wurden AFTER.
Clint Pachl
5
SELECT unnest(enum_range(NULL::your_enum))::text AS your_column

Dies gibt eine einspaltige Ergebnismenge des Inhalts der Aufzählung "your_enum" mit einer Spalte mit dem Namen "your_column" vom Typ text zurück.

Justin Ohms
quelle
4

Mit der folgenden Abfrage können Sie alle Aufzählungswerte für eine Aufzählung abrufen. Mit der Abfrage können Sie auswählen, in welchem ​​Namespace sich auch die Aufzählung befindet (dies ist erforderlich, wenn die Aufzählung in mehreren Namespaces definiert ist; andernfalls können Sie diesen Teil der Abfrage weglassen).

SELECT enumlabel
FROM pg_enum
WHERE enumtypid=(SELECT typelem
                 FROM pg_type
                 WHERE typname='_myenum' AND
                 typnamespace=(SELECT oid
                               FROM pg_namespace
                               WHERE nspname='myschema'))
David Underhill
quelle
1
Was meinst du damit, dass es der Array-Typ ist? Dies funktioniert bei mir (PostgreSQL 9.0).
David Underhill
+1 Dies funktionierte für mich, während die Antwort von @ Kev aufgrund der Verwendung von Schemas in meiner Datenbank nicht funktionierte.
user9645