Postgresql 列表Postgres枚举类型

Postgresql 列表Postgres枚举类型,postgresql,Postgresql,天气很好。但是,它只列出了模式和类型名。如何列出实际的枚举值?例如,在上面的链接答案中,我希望得到以下结果 schema type values ------------- -------- ------- communication channels 'text_message','email','phone_call','broadcast' 我总是忘了怎么做。根据另一个答案和评论,这里是一个逗号分隔的列表。我喜欢复制粘贴片段。感谢您的帮助: select

天气很好。但是,它只列出了
模式
类型名
。如何列出实际的枚举值?例如,在上面的链接答案中,我希望得到以下结果

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

我总是忘了怎么做。根据另一个答案和评论,这里是一个逗号分隔的列表。我喜欢复制粘贴片段。感谢您的帮助:

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;
选择enum_范围(enum_first(null::province),null::province);
@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命令创建触发器


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

如果您有表名和列名(但没有类型名),请使用以下内容:

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\u range
(与在类型上使用它的其他答案不同),它将为存在的每一行返回数据,这不是您想要的。因此,请改用上述查询。

这将列出所有枚举类型的列及其潜在值:

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;

您可以通过以下方式列出数据类型:

\dT+ channels

添加订单

选择
n、 nspname作为枚举_架构,
t、 类型名称作为枚举名称,
e、 enumlabel作为enum_值
从…起
pg_型t
在t.oid=e.enumtypid上连接pg_enum e
将pg_catalog.pg_名称空间n连接到n.oid=t.typ名称空间
订购人
枚举名称,
e、 枚举器;

此:
选择unnest(枚举范围(NULL::myenum))
将枚举类型返回为行。

选择枚举范围(NULL::myenum)

sweet。。。最好使用
string_agg(e.enumlabel,“,”)作为enum_值
,并使用适当的
分组方式
。非常感谢。这太荒谬了。究竟为什么没有速记?(不过感谢您的解决方案!)效果非常好,对于其他人来说,“省”是枚举类型名称:)使用
select unest(enum_range(null,null::name_of_enum_type))每行获取一个值。谢谢!根据文档,如果希望整个范围
选择enum\u range(null::my\u enum)
,则无需重复两次。由于您没有加入
pg_namespace
,如果在多个架构中存在相同的枚举名称,则会导致错误的关联…@AlisonR。我相信作者正在寻找一种sql语法。此答案中的解决方案仅适用于本机postgres cli客户端。然而,这正是我所寻找的;)对我来说,这是一个完美的查询。我非常喜欢这个最短的版本。如果需要在强制转换数据之前验证数据,可以在查询或WHERE子句中运行一个row=any(选择enum_range(NULL::myenum)),您将看到哪里有问题。
\dT+ channels