Ответ 1
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
предлагаемый запрос для отображения типов ENUM. Но это всего лишь списки schema
и typname
. Как я могу перечислять фактические значения ENUM? Например, в связанном ответе выше я хотел бы получить следующий результат
schema type values
------------- -------- -------
communication channels 'text_message','email','phone_call','broadcast'
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
select enum_range(enum_first(null::province),null::province);
Вы можете указать тип данных через
\dT+ channels
https://www.postgresql.org/docs/current/static/app-psql.html#APP-PSQL-META-COMMANDS
Я всегда забываю, как это сделать. В соответствии с другим ответом и комментарием, здесь это список, разделенный запятыми. Мне нравятся фрагменты copy-paste. Спасибо за помощь.
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
@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 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
в столбце (в отличие от других ответов, которые использовали его для типа), он будет возвращать данные для каждой существующей строки, чего вы не хотите. Поэтому используйте указанный выше запрос.