2012-03-02 59 views
39

suggested query to list ENUM types是伟大的。但是,它只是列出了schematypname。如何列出实际的ENUM值?例如,在上面的链接的答案,我希望下面的结果列表Postgres ENUM类型

schema   type  values 
------------- -------- ------- 
communication channels 'text_message','email','phone_call','broadcast' 

回答

67
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 
+2

甜......甚至更好使用'string_agg(e.enumlabel,',')作为enum_value'和相应的'GROUP BYs'。非常感谢。 – punkish 2012-03-02 21:44:35

+1

这太可笑了。为什么地球上没有速记? (感谢您的解决方案!) – dpb 2015-05-26 23:50:39

+25

@dpb:您可以在psql命令行客户端中使用'\ dT +' – 2015-05-27 05:37:03

8

我总是忘了如何做到这一点。根据其他答案和评论,这里是以逗号分隔的列表。我喜欢复制粘贴片段。谢谢您的帮助。

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 
37
select enum_range(enum_first(null::province),null::province); 
+2

像其他人一样工作,'省'是枚举类型名称:) – 2015-06-30 11:45:29

+0

男人,你很酷 – Andrey 2016-01-15 19:06:14

+5

使用'select unnest(enum_range(null,null :: name_of_enum_type));'为每行获取一个值。 – 2016-02-01 14:17:23

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; 

然后,您可以创建一个触发器插入命令。

上述内容将存储在数据库中以备将来参考。

-1

如果你有表和列名,(但不是类型名称)使用此:

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(相反,该用它在一个类型的其他答案)它会返回存在的每一行的数据,这不是你想要的。因此,请改用上述查询。

+0

由于您不加入'pg_namespace',这会导致错误的关联,如果同一个枚举名称存在于多个模式... – blubb 2017-12-12 14:10:07

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;