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?
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?
Antworten:
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))
Diese Lösung funktioniert wie erwartet, auch wenn sich Ihre Aufzählung nicht im Standardschema befindet. Zum Beispiel ersetzen myenum
durch 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.
NULL::
?
SELECT enum_range(myenum)
? Was bedeutet Casting null
?
Versuchen:
SELECT e.enumlabel
FROM pg_enum e
JOIN pg_type t ON e.enumtypid = t.oid
WHERE t.typname = 'myenum'
ORDER BY e.enumsortorder
an die Abfrage an. Die aufgezählten Werte sind höchstwahrscheinlich nicht in der richtigen Reihenfolge, wenn neue Werte mit BEFORE
oder in den Aufzählungstyp eingefügt wurden AFTER
.
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.
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'))