【问题标题】:ERROR: cannot deconstruct an array as an object错误:无法将数组解构为对象
【发布时间】:2020-12-07 12:15:19
【问题描述】:

这个问题是this的后续问题

我有下表的示例记录:

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;

得到一个错误:

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

【问题讨论】:

    标签: sql arrays json postgresql postgresql-10


    【解决方案1】:

    如果您的所有数组都包含一个对象,如您的示例数据所示,您可以这样做:

    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;
    

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

    【讨论】:

      猜你喜欢
      • 2018-05-06
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-06-11
      • 1970-01-01
      • 2021-03-15
      • 1970-01-01
      相关资源
      最近更新 更多