列出Postgres ENUM类型

问题描述 投票:60回答:7

suggested query to list ENUM types很棒。但是,它只列出了schematypname。如何列出实际的ENUM值?例如,在上面的链接答案中,我希望得到以下结果

schema         type      values
-------------  --------  -------
communication  channels  'text_message','email','phone_call','broadcast'
postgresql
7个回答
89
投票
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

52
投票
select enum_range(enum_first(null::province),null::province);

35
投票

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;

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命令创建触发器。

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


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;

-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(与在类型上使用它的其他答案形成对比),它将返回存在的每一行的数据,这不是您想要的。所以请改用上面的查询。

© www.soinside.com 2019 - 2024. All rights reserved.