list Postgres Typ ENUM

105

Zasugerował zapytanie do listy typów ENUM jest wielki. Ale to tylko lista schemai typname. Jak wyświetlić rzeczywiste wartości ENUM? Na przykład w powyższej połączonej odpowiedzi chciałbym uzyskać następujący wynik

schema         type      values
-------------  --------  -------
communication  channels  'text_message','email','phone_call','broadcast'
punkowy
źródło

Odpowiedzi:

139
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
koń bez imienia
źródło
4
słodki ... jeszcze lepiej używać string_agg(e.enumlabel, ', ') as enum_valuez odpowiednim GROUP BYs. Wielkie dzięki.
punkowy
4
To jest niedorzeczne. Dlaczego u licha nie ma skrótu? (Dzięki za rozwiązanie!)
dpb
72
select enum_range(enum_first(null::province),null::province);
mxc
źródło
11
Działał jak urok, dla innych „prowincja” to nazwa typu wyliczenia :)
Rana Deep
14
Użyj, select unnest(enum_range(null, null::name_of_enum_type));aby uzyskać jedną wartość na wiersz.
Brian H
16
Dzięki! Zgodnie z dokumentacją nie musisz powtarzać tego dwa razy, jeśli chcesz uzyskać cały zakres select enum_range(null::my_enum). postgresql.org/docs/9.5/static/functions-enum.html
Sam Eaton
16

Zawsze zapominam, jak to zrobić. Zgodnie z drugą odpowiedzią i komentarzem, tutaj jest to lista oddzielona przecinkami. Lubię fragmenty kopiuj-wklej. Dzięki za pomoc:

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
źródło
4

This: SELECT unnest(enum_range(NULL::myenum))zwraca typy wyliczenia jako wiersze.

Brokolicový Džuß
źródło
0

@dpb:

Jeśli chcesz utworzyć w tym celu stałą, łatwą metodę dostępu, zawsze możesz utworzyć widok

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;

Następnie można utworzyć wyzwalacz dla polecenia wstawiania.

Powyższe będzie przechowywało to w bazie danych do celów odniesienia w przyszłości.

3 szt
źródło
0

Zawiera listę wszystkich kolumn typu wyliczeniowego i ich potencjalnych wartości:

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
źródło
0

Dodaj zamówienie

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
źródło
-2

Jeśli masz nazwę tabeli i kolumny (ale nie nazwę typu), użyj tego:

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

Jeśli użyjesz enum_rangew kolumnie (w przeciwieństwie do innych odpowiedzi, które używały tego w typie), zwróci dane dla każdego istniejącego wiersza, co nie jest tym, czego chcesz. Zamiast tego użyj powyższego zapytania.

Ariel
źródło
1
Ponieważ nie dołączasz pg_namespace, powoduje to błędne skojarzenia, jeśli ta sama nazwa wyliczenia występuje w więcej niż jednym schemacie ...
blubb