判断用户自定义类型是否为ENUM

Dom*_*ton 6 postgresql metadata enum user-defined-type

有没有办法确定 PostgreSQL 中的用户定义类型是否是 ENUM?

基本上我们有以下几点:

CREATE TYPE foo AS ENUM (
  'Sometimes',
  'You',
  'Wanna',
  'Go',
  'Where Everybody Knows Your Name'
);
Run Code Online (Sandbox Code Playgroud)

通过以下方式实例化的表:

CREATE TABLE bar (
  lyrics foo DEFAULT 'Wanna'::foo
);
Run Code Online (Sandbox Code Playgroud)

我能够foo从列中确定的类型lyrics,但是,我无法找到确定是否foo是 ENUM 的方法。

对于上下文,我需要此信息以编程方式获取foo给定lyrics.

dez*_*zso 5

与此类问题一样,\set ECHO_HIDDEN on命令有psql帮助。 \dT+如果有问题的类型是枚举,将显示枚举的可能值。输出背后的查询相当复杂,但可以简化它以满足您的需求,例如

SELECT format_type(t.oid, NULL) AS name,
       array_agg(e.enumlabel ORDER BY e.enumsortorder) AS elements
  FROM pg_type AS t 
  LEFT JOIN pg_enum AS e ON e.enumtypid = t.oid
 WHERE t.typname = 'foo'
 GROUP BY t.oid;
Run Code Online (Sandbox Code Playgroud)

{NULL}如果类型不是枚举,这将返回(其中包含 NULL 的数组),否则将返回实际元素作为数组。如有必要,您可以进一步调整它。


Eva*_*oll 4

你可以做这样的事情,

SELECT true
FROM pg_enum
WHERE enumtypid = pg_typeof('You'::foo)::regtype
FETCH FIRST ROW ONLY;
Run Code Online (Sandbox Code Playgroud)

您也可以创建一个简单的函数来执行此操作,

CREATE FUNCTION is_enum(x regtype)
RETURNS bool
AS $$
  SELECT true
  FROM pg_enum
  WHERE enumtypid = x
  FETCH FIRST ROW ONLY;
$$ LANGUAGE sql
IMMUTABLE;

SELECT is_enum(pg_typeof('You'::foo));
 is_enum 
---------
 t
(1 row)
Run Code Online (Sandbox Code Playgroud)