首页 > 解决方案 > 错误:无法将数组解构为对象

问题描述

这个问题是这个问题的后续

我有下表与示例记录:

create table jtest
(
    id int,
    jcol json
);

insert into jtest values(1,'[{"name":"Jack","address1":"HNO 123"}]');
insert into jtest values(1,'[{"address2":"STREET1"}]');
insert into jtest values(1,'[{"address3":"UK"}]');

select * from jtest;

id      jcol
-------------------------------------------
1       [{"name":"Jack","address":"HNO 123 UK"}]
1       [{"address2":"STREET1"}]
1       [{"address3":"UK"}]

预期结果:

id      jcol
--------------------------------------------------------------------------------------------
1       [{"name":"Jack","address":"HNO 123 UK", "address2":"STREET1", "address3":"UK"}]

尝试了以下查询:

select id,json_agg(jcol) as jcol 
from jtest
group by id;

但是得到的结果是出乎意料的:

id      jcol
--------------------------------------------------------------------------------------------
1       [[{"name":"Jack","address":"HNO 123 UK"}], [{"address2":"STREET1"}], [{"address3":"UK"}]]   

尝试S-Man回答:

SELECT
    id,
    json_object_agg(key, value)  
FROM
    jtest,
    json_each(jcol)              
GROUP BY id;

收到错误:

错误:无法将数组解构为对象

标签: sqlarraysjsonpostgresqlpostgresql-10

解决方案


如果您的所有数组都包含一个对象,如您的示例数据所示,您可以执行以下操作:

select t.id, jsonb_build_array(json_object_agg(x.k, x.v))
from jtest t
cross join lateral json_each(t.jcol -> 0) as x(k, v)            
group by t.id;

这与您的原始代码基本相同的逻辑,只是它获取数组中的第一个(唯一)对象 before json_each()


推荐阅读