Liste Postgres ENUM Typ

89

Die vorgeschlagene Abfrage zum Auflisten von ENUM-Typen ist großartig. Aber es listet nur die schemaund die typname. Wie liste ich die tatsächlichen ENUM-Werte auf? In der oben verlinkten Antwort möchte ich beispielsweise das folgende Ergebnis

schema         type      values
-------------  --------  -------
communication  channels  'text_message','email','phone_call','broadcast'
punkig
quelle

Antworten:

127
select n.nspname as enum_schema,  
       t.typname as enum_name,  
       e.enumlabel as enum_value
from pg_type t 
   join pg_enum e on t.oid = e.enumtypid  
   join pg_catalog.pg_namespace n ON n.oid = t.typnamespace
ein Pferd ohne Name
quelle
4
süß ... noch besser string_agg(e.enumlabel, ', ') as enum_valuemit dem passenden zu verwenden GROUP BYs. Danke vielmals.
Punkish
4
Das ist lächerlich. Warum um alles in der Welt gibt es keine Abkürzung? (Danke für die Lösung!)
dpb
69
select enum_range(enum_first(null::province),null::province);
mxc
quelle
10
Für andere wie ein Zauber funktioniert, ist 'Provinz' der Name des Aufzählungstyps :)
Rana Deep
13
Verwenden Sie select unnest(enum_range(null, null::name_of_enum_type));diese Option , um einen Wert pro Zeile abzurufen.
Brian H
15
Vielen Dank! Laut den Dokumenten müssen Sie es nicht zweimal wiederholen, wenn Sie den gesamten Bereich möchten select enum_range(null::my_enum). postgresql.org/docs/9.5/static/functions-enum.html
Sam Eaton
15

Ich vergesse immer, wie das geht. Wie aus der anderen Antwort und dem Kommentar hervorgeht, handelt es sich hier um eine durch Kommas getrennte Liste. Ich mag Copy-Paste-Snippets. Danke für die Hilfe:

select n.nspname as enum_schema,  
    t.typname as enum_name,
    string_agg(e.enumlabel, ', ') as enum_value
from pg_type t 
    join pg_enum e on t.oid = e.enumtypid  
    join pg_catalog.pg_namespace n ON n.oid = t.typnamespace
group by enum_schema, enum_name;
Michael
quelle
0

@dpb:

Wenn Sie hierfür eine permanente Methode für den einfachen Zugriff erstellen möchten, können Sie jederzeit eine Ansicht erstellen

CREATE OR REPLACE VIEW oublic.enumz AS 
 SELECT n.nspname AS enum_schema,
  t.typname AS enum_name,
  e.enumlabel AS enum_value
 FROM pg_type t
 JOIN pg_enum e ON t.oid = e.enumtypid
 JOIN pg_namespace n ON n.oid = t.typnamespace;

Sie können dann einen Trigger für den Befehl insert erstellen.

Das Obige speichert dies in der Datenbank für zukünftige Referenzzwecke.

3 Stück
quelle
0

Hier werden alle Spalten mit Aufzählungstypen und ihre potenziellen Werte aufgelistet :

SELECT
  table_schema || '.' || table_name || '.' || column_name as field_name,
  pg_enum.enumlabel as value
FROM pg_type
  JOIN pg_enum ON pg_enum.enumtypid = pg_type.oid
  JOIN pg_namespace on pg_type.typnamespace = pg_namespace.oid
  JOIN information_schema.columns ON (information_schema.columns.udt_name = pg_type.typname AND information_schema.columns.udt_schema = pg_namespace.nspname)
WHERE pg_type.typtype = 'e'
ORDER BY field_name, pg_enum.enumsortorder;
blubb
quelle
0

Bestellung hinzufügen

SELECT
  n.nspname AS enum_schema,
  t.typname AS enum_name,
  e.enumlabel AS enum_value
FROM
  pg_type t
  JOIN pg_enum e ON t.oid = e.enumtypid
  JOIN pg_catalog.pg_namespace n ON n.oid = t.typnamespace
ORDER BY
  enum_name,
  e.enumsortorder;
iugo
quelle
0

Dies: SELECT unnest(enum_range(NULL::myenum))Gibt Aufzählungstypen als Zeilen zurück.

Brokolicový Džuß
quelle
-2

Wenn Sie den Tabellen- und Spaltennamen (aber nicht den Typnamen) haben, verwenden Sie diesen:

SELECT pg_enum.enumlabel
FROM pg_type
 JOIN pg_enum ON pg_enum.enumtypid = pg_type.oid
 JOIN information_schema.columns ON information_schema.columns.udt_name =
                                    pg_type.typname
WHERE pg_type.typtype = 'e' AND
      table_name = $1 AND column_name = $2 ORDER BY pg_enum.enumsortorder

Wenn Sie enum_rangeeine Spalte verwenden (im Gegensatz zu den anderen Antworten, die sie für einen Typ verwendet haben), werden Daten für jede vorhandene Zeile zurückgegeben, was nicht das ist, was Sie möchten. Verwenden Sie stattdessen die obige Abfrage.

Ariel
quelle
1
Da Sie nicht beitreten pg_namespace, führt dies zu falschen Assoziationen, wenn der gleiche Aufzählungsname in mehr als einem Schema vorhanden ist ...
blubb