SQL查询以获取枚举可以具有的所有值


Answers:


264

如果要数组:

SELECT enum_range(NULL::myenum)

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

SELECT unnest(enum_range(NULL::myenum))  

附加信息

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

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

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

如果要指定列名称,则可以追加AS my_col_name


感谢Justin Ohms指出了一些其他技巧,这些技巧已纳入我的答案。


1
这个答案更加简洁。不错的贡献!
Darin Peterson

3
嵌套调用将返回类型为myenum的记录,其列名称为“ myenum”。您可能还想将枚举转换为文本并通过添加类似内容来指定列名称。:: text AS my_column
Justin Ohms


1
是什么意思NULL::
宋祖

1
@ChrisL谢谢。看起来很奇怪。我们为什么不能SELECT enum_range(myenum)呢?铸造是什么意思null
宋祖

31

尝试:

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

1
如果在多个模式中有相同的枚举,则可能需要缩小一点。如果是这种情况,请参阅postgresql.org/docs/current/static/catalog-pg-type.html了解详细信息。
凯夫

1
我认为您需要在“ myenum”前面加上下划线。查看我的答案是否需要获取枚举值,并且枚举名称可以在多个模式中使用。
David Underhill

如果枚举顺序很重要,请追加ORDER BY e.enumsortorder到查询。如果使用BEFORE或将新值插入枚举类型,则枚举值很可能会乱序AFTER
克林特·帕奇

5
SELECT unnest(enum_range(NULL::your_enum))::text AS your_column

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


4

您可以使用以下查询获取枚举的所有枚举值。通过查询,您还可以选择枚举所在的名称空间(如果在多个名称空间中定义了枚举,则需要此名称空间;否则,可以省略查询的那一部分)。

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'))

1
您是什么意思,它是数组类型?这对我有效(PostgreSQL 9.0)。
David Underhill

+1这对我有用,而@Kev的答案却没有,因为在我的数据库中使用了模式。
user9645 2013年
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.