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'

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

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

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;

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.


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;

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;


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


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
Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.