我在PostgreSQL上有一个枚举类型,我想创建一个视图,其中包含每个枚举值的列。
我的用例与此question类似。我有一个jsonb列,我想变成一个由json blob键组成的列的视图。在我的情况下,不同之处在于有效键是在枚举中定义的,而不是从对象本身聚合而成的。
下面的SQL语句本质上是我想做的,但是不起作用:
SELECT json_populate_record(null::activity_type_enum, activities) from some_table;
是否可以将枚举类型转换为json_populate_record
的第一个参数所期望的类型?
答案 0 :(得分:0)
这需要一些动态SQL。
假定视图中的所有列均应为text
类型。
enum_range()
将枚举成员作为数组,并使用unnest()
将它们转换为集合。' text'
并使用string_agg()
建立一个逗号分隔的列表。这样,我们得到了列定义。CREATE VIEW
语句,该语句从别名为我们所构建的列定义的表横向交叉连接json_to_record()
中进行选择。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;
如果json_to_record()
的类型是jsonb_to_record()
而不是activities
,请用jsonb
替换json
。
但是,如果枚举发生更改,则必须重新运行DO
块,以使视图反映更改。