sql - 错误:无法将数组解构为对象
问题描述
这个问题是这个问题的后续
我有下表与示例记录:
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;
收到错误:
错误:无法将数组解构为对象
解决方案
如果您的所有数组都包含一个对象,如您的示例数据所示,您可以执行以下操作:
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()
。
推荐阅读
- odata - 从 odata v2 迁移到 v4 时缺少方法
- javascript - 需要在javascript中验证带有特殊字符的数字
- hadoop - Hbase TimeSeries 数据分布
- jquery - 引导数据表列宽
- c# - 无法添加 SQLite 数据源
- networkx - 使用from_pandas_edgelist networkx后如何设置节点属性
- jquery - 使用 jquery 获取嵌套 gridview 的总行数 - ASP.NET C#
- javascript - 如何为 P5.js 中的 keyPressed() 函数进行时间缓冲?
- macos - 启用开发人员签名失败服务器请求 MacOS
- angular - 选择框默认值未显示 [(ngModel)] Angular 2