You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

PostgreSQL:基于现有表按ID分组创建含嵌套JSON的视图

没问题,我来帮你搞定这个PostgreSQL视图的创建需求!

首先看你的需求:要基于表t创建视图,按id分组输出包含嵌套转义JSON字符串的结构。从示例来看,应该每个id对应唯一一行数据(如果id有重复的话,后续可以调整聚合逻辑,先假设id是唯一键)。

这里我们可以用PostgreSQL自带的JSON构建函数一步步实现:

分步解释:

  1. 构建最内层的k2 JSON:用json_build_object把字段c和d组装成{"k21":"value_c","k22":"value_d"},然后转成文本类型(::text),这样它会被当作字符串值嵌入到上层结构中,自动带上转义的双引号。
  2. 构建x对应的JSON结构:再用一次json_build_object,把字段b作为k1的值,上面的k2文本作为k2的值,同样转成文本类型,得到带转义的完整字符串,也就是目标里x的内容。
  3. 组装外层最终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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.07 07:57:50