suggested query to list ENUM types很棒。但是,它仅列出了schema
和typname
。如何列出实际的ENUM值?例如,在上面的链接答案中,我希望得到以下结果
schema type values
------------- -------- -------
communication channels 'text_message','email','phone_call','broadcast'
答案 0 :(得分:90)
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
答案 1 :(得分:52)
select enum_range(enum_first(null::province),null::province);
答案 2 :(得分:39)
您可以通过
列出数据类型\dT+ channels
https://www.postgresql.org/docs/current/static/app-psql.html#APP-PSQL-META-COMMANDS
答案 3 :(得分:12)
我总是忘记怎么做。根据其他答案和评论,这里是一个以逗号分隔的列表。我喜欢复制粘贴代码段。谢谢你的帮助:
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;
答案 4 :(得分:3)
此:SELECT unnest(enum_range(NULL::myenum))
返回枚举类型作为行。
答案 5 :(得分:3)
SELECT enum_range(NULL::myenum)
答案 6 :(得分:0)
@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;
然后,您可以为insert命令创建一个触发器。
以上内容将把它存储在数据库中以备将来参考。
答案 7 :(得分:0)
列出了所有枚举类型列及其潜在值:
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;
答案 8 :(得分:0)
添加订单
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;
答案 9 :(得分:-2)
如果您有表名和列名,(但不是类型名称),请使用:
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
(与在类型上使用它的其他答案形成对比),它将返回存在的每一行的数据,这不是您想要的。所以请改用上面的查询。