从PostgreSQL中的枚举类型创建列

时间:2018-08-31 14:09:44

标签: sql json postgresql

我在PostgreSQL上有一个枚举类型,我想创建一个视图,其中包含每个枚举值的列。

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

下面的SQL语句本质上是我想做的,但是不起作用:

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

是否可以将枚举类型转换为json_populate_record的第一个参数所期望的类型?

1 个答案:

答案 0 :(得分: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块,以使视图反映更改。