Zasugerował zapytanie do listy typów ENUM jest wielki. Ale to tylko lista schema
i 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'
postgresql
punkowy
źródło
źródło
string_agg(e.enumlabel, ', ') as enum_value
z odpowiednimGROUP BYs
. Wielkie dzięki.Możesz wyświetlić typ danych za pośrednictwem
https://www.postgresql.org/docs/current/static/app-psql.html#APP-PSQL-META-COMMANDS
źródło
select enum_range(enum_first(null::province),null::province);
źródło
select unnest(enum_range(null, null::name_of_enum_type));
aby uzyskać jedną wartość na wiersz.select enum_range(null::my_enum)
. postgresql.org/docs/9.5/static/functions-enum.htmlZawsze 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;
źródło
This:
SELECT unnest(enum_range(NULL::myenum))
zwraca typy wyliczenia jako wiersze.źródło
@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.
źródło
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;
źródło
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;
źródło
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_range
w 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.źródło
pg_namespace
, powoduje to błędne skojarzenia, jeśli ta sama nazwa wyliczenia występuje w więcej niż jednym schemacie ...