PostgreSQL:基于现有表按ID分组创建含嵌套JSON的视图
没问题,我来帮你搞定这个PostgreSQL视图的创建需求!
首先看你的需求:要基于表t创建视图,按id分组输出包含嵌套转义JSON字符串的结构。从示例来看,应该每个id对应唯一一行数据(如果id有重复的话,后续可以调整聚合逻辑,先假设id是唯一键)。
这里我们可以用PostgreSQL自带的JSON构建函数一步步实现:
分步解释:
- 构建最内层的k2 JSON:用
json_build_object把字段c和d组装成{"k21":"value_c","k22":"value_d"},然后转成文本类型(::text),这样它会被当作字符串值嵌入到上层结构中,自动带上转义的双引号。 - 构建x对应的JSON结构:再用一次
json_build_object,把字段b作为k1的值,上面的k2文本作为k2的值,同样转成文本类型,得到带转义的完整字符串,也就是目标里x的内容。 - 组装外层最终JSON:最后用
json_build_object把id、a和上面生成的x整合起来,得到你要的完整结构。
完整的创建视图SQL:
CREATE VIEW nested_json_view AS SELECT json_build_object( 'id', id, 'a', a, -- 如果你需要把a字段转成大写(比如示例里的"A"),可以改成 upper(a) 'x', ( json_build_object( 'k1', b, 'k2', (json_build_object('k21', c, 'k22', d))::text ) )::text ) AS result FROM t GROUP BY id, a, b, c, d;
测试查询:
执行下面的语句就能看到结果:
SELECT * FROM nested_json_view;
返回的结果就会是你想要的格式:
{"id":1,"a":"value_a","x":"{\"k1\":\"value_b\",\"k2\":\"{\"k21\":\"value_c\",\"k22\":\"value_d\"}\"}"}
如果你的id存在重复值,需要对其他字段做聚合(比如取最大值),可以把GROUP BY后的字段调整为仅id,然后其他字段用MAX(a)、MAX(b)这样的聚合函数包裹,比如:
CREATE VIEW nested_json_view AS SELECT json_build_object( 'id', id, 'a', MAX(a), 'x', ( json_build_object( 'k1', MAX(b), 'k2', (json_build_object('k21', MAX(c), 'k22', MAX(d)))::text ) )::text ) AS result FROM t GROUP BY id;
内容的提问来源于stack exchange,提问作者Shudipta Sharma
相关产品推荐
相关产品推荐

