从PostgreSQL中的枚举类型创建列

问题描述 投票:0回答:1

我在PostgreSQL上有一个枚举类型,我想创建一个视图,每个枚举值都有一列。

我的用例类似于这个question。我有一个jsonb列,我想变成一个视图,其中的列由json blob的键组成。我的不同之处在于有效密钥是在枚举中定义的,而不是从对象本身聚合而来。

以下SQL语句基本上是我想要做的,但不起作用:

SELECT json_populate_record(null::activity_type_enum, activities) from some_table;

有没有办法将枚举类型转换为json_populate_record的第一个参数所期望的类型?

sql json postgresql
1个回答
0
投票

这需要一些动态SQL。

假设视图中的所有列都应具有text类型。

  1. 我们使用enum_range()将枚举成员作为数组,并使用unnest()将它们转换为集合。
  2. 对于集合中的每个枚举成员,我们附加' text'并使用string_agg()构建逗号分隔的列表。像这样,我们得到一个列定义。
  3. 我们建立了一个CREATE VIEW语句,从表横向交叉连接json_to_record()选择我们建立的列定义。
  4. CREATE VIEW执行EXECUTE语句。

我们一起得到以下DO块:

DO
$$
BEGIN
  EXECUTE '
CREATE VIEW some_view
AS
  SELECT x.*
         FROM some_table t
              CROSS JOIN LATERAL json_to_record(t.activities) x(' || (SELECT string_agg(un.m || ' text', ', ')
                                                                             FROM unnest(enum_range(NULL::activity_type_enum)) un(m)) || ');
';
END;
$$
LANGUAGE plpgsql;

db<>fiddle

如果json_to_record()的类型是jsonb_to_record()而不是activities,则用jsonb替换json

但是,如果枚举更改,则必须重新运行DO块,以使视图反映更改。

© www.soinside.com 2019 - 2024. All rights reserved.