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

Postgres jsonb_agg函数输出被额外JSON字段包裹的原因及解决方法

问题解答

原因分析

你遇到的问题是因为子查询中的jsonb_set结果没有指定列别名,Postgres会默认将这个列命名为jsonb_set。当你使用jsonb_agg(t)时,是把整个行(包含默认列名的键值对)作为JSON对象聚合,所以最终结果里会多出一层{"jsonb_set": ...}的结构。

解决方法

有两种简单的方式可以得到预期结果:

方法一:给子查询的结果指定别名,聚合该别名列

修改SQL语句,给jsonb_set的结果起一个别名(比如val),然后聚合这个具体的列,而不是整个行:

SELECT jsonb_agg(t.val) AS json_array
FROM (SELECT jsonb_set('[{"f1": "1","f2": null},  2,  null,  3]', '{0,f1}', '"DELETEME"',true) AS val) t

方法二:直接聚合子查询中的匿名列

如果不想额外加别名,也可以直接引用子查询中的默认列名,或者去掉子查询直接聚合函数结果:

-- 引用默认列名
SELECT jsonb_agg(t.jsonb_set) AS json_array
FROM (SELECT jsonb_set('[{"f1": "1","f2": null},  2,  null,  3]', '{0,f1}', '"DELETEME"',true)) t
-- 去掉子查询,直接聚合函数结果
SELECT jsonb_agg(jsonb_set('[{"f1": "1","f2": null},  2,  null,  3]', '{0,f1}', '"DELETEME"',true)) AS json_array

内容的提问来源于stack exchange,提问作者Zmur

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.21 12:23:11