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.
与此类问题一样,\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 的数组),否则将返回实际元素作为数组。如有必要,您可以进一步调整它。
你可以做这样的事情,
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)
| 归档时间: |
|
| 查看次数: |
737 次 |
| 最近记录: |