Предложил запрос в список типов ENUM велик. Но, это просто списки schema
и typname
. Как мне перечислить фактические значения ENUM? Например, в приведенном выше ответе я хотел бы получить следующий результат
schema type values
------------- -------- -------
communication channels 'text_message','email','phone_call','broadcast'
postgresql
панковский
источник
источник
string_agg(e.enumlabel, ', ') as enum_value
с подходящимGROUP BYs
. Большое спасибо.Вы можете указать тип данных через
https://www.postgresql.org/docs/current/static/app-psql.html#APP-PSQL-META-COMMANDS
источник
select enum_range(enum_first(null::province),null::province);
источник
select unnest(enum_range(null, null::name_of_enum_type));
чтобы получить одно значение в строке.select enum_range(null::my_enum)
. postgresql.org/docs/9.5/static/functions-enum.htmlЯ всегда забываю, как это делать. Согласно другому ответу и комментарию, здесь это список, разделенный запятыми. Мне нравятся фрагменты копипаста. Спасибо за помощь:
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;
источник
Это:
SELECT unnest(enum_range(NULL::myenum))
возвращает типы перечисления в виде строк.источник
@dpb:
Если вы хотите создать для этого постоянный метод легкого доступа, вы всегда можете создать представление
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;
Затем вы можете создать триггер для команды вставки.
Вышеупомянутое сохранит это в базе данных для использования в будущем.
источник
В нем перечислены все столбцы с перечислением и их потенциальные значения:
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;
источник
Добавить заказ
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;
источник
Если у вас есть имя таблицы и столбца (но не имя типа), используйте это:
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
Если вы используете
enum_range
столбец (в отличие от других ответов, которые использовали его для типа), он вернет данные для каждой существующей строки, а это не то, что вы хотите. Поэтому используйте вместо этого приведенный выше запрос.источник
pg_namespace
, это приводит к неправильным ассоциациям, если одно и то же имя перечисления присутствует в более чем одной схеме ...