【问题标题】:SQL query to get all values a enum can haveSQL查询以获取枚举可以具有的所有值
【发布时间】:2010-12-09 14:57:15
【问题描述】:

Postgresql 前段时间获得了枚举支持。

CREATE TYPE myenum AS ENUM (
'value1',
'value2',
);

如何通过查询获取枚举中指定的所有值?

【问题讨论】:

标签: postgresql enums


【解决方案1】:

如果你想要一个数组:

SELECT enum_range(NULL::myenum)

如果您想为枚举中的每个项目单独记录:

SELECT unnest(enum_range(NULL::myenum))  

附加信息

即使您的枚举不在默认架构中,此解决方案也会按预期工作。例如,将myenum 替换为myschema.myenum

上述查询返回记录的数据类型为myenum。根据您的操作,您可能需要转换为文本。例如

SELECT unnest(enum_range(NULL::myenum))::text

如果要指定列名,可以附加AS my_col_name


感谢 Justin Ohms 指出了一些额外的提示,我将这些提示纳入我的回答中。

【讨论】:

  • 这个答案要简洁得多。不错的贡献!
  • unnest 调用将返回 myenum 类型的记录,其列名为“myenum”。您可能还希望将枚举转换为文本并通过添加类似的内容来指定列名。 ::text AS my_column
  • 要了解更多关于枚举函数的信息,您可以查看此链接postgresql.org/docs/8.3/static/functions-enum.htmlpostgresql.org/docs/9.2/static/functions-array.html
  • NULL::是什么意思?
  • @ChrisL 谢谢。看起来很奇怪。为什么我们不能SELECT enum_range(myenum)?投null是什么意思?
【解决方案2】:
SELECT unnest(enum_range(NULL::your_enum))::text AS your_column

这将返回枚举“your_enum”内容的单列结果集,其中有一列名为“your_column”,类型为文本。

【讨论】:

    【解决方案3】:

    您可以使用以下查询获取枚举的所有枚举值。该查询还允许您选择枚举所在的命名空间(如果枚举在多个命名空间中定义,则需要这样做;否则您可以省略该部分查询)。

    SELECT enumlabel
    FROM pg_enum
    WHERE enumtypid=(SELECT typelem
                     FROM pg_type
                     WHERE typname='_myenum' AND
                     typnamespace=(SELECT oid
                                   FROM pg_namespace
                                   WHERE nspname='myschema'))
    

    【讨论】:

    • 数组类型是什么意思?这对我有用(PostgreSQL 9.0)。
    • +1 这对我有用,而 @Kev 的回答没有,因为我的数据库中使用了模式。
    【解决方案4】:

    试试:

    SELECT e.enumlabel
      FROM pg_enum e
      JOIN pg_type t ON e.enumtypid = t.oid
      WHERE t.typname = 'myenum'
    

    【讨论】:

    • 如果您在多个架构中拥有相同的枚举,则可能需要稍微缩小范围。如果是这种情况,请参阅postgresql.org/docs/current/static/catalog-pg-type.html 了解详情。
    • 我认为您需要在“myenum”前加上下划线。如果您需要获取枚举值,请查看我的回答,并且枚举名称可能用于多个模式。
    • 如果枚举顺序很重要,请将ORDER BY e.enumsortorder 附加到查询中。如果使用BEFOREAFTER 将新值插入枚举类型,则枚举值很可能会出现乱序。
    猜你喜欢
    • 2019-04-08
    • 1970-01-01
    • 2020-01-30
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-07-18
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多