postgresql - 从 postgresql 中的 jsonb 嵌套数组中删除键值对
问题描述
我有 jsonb 数据作为
{
"a":[
{"b":1,"c":2,"d":3},
{"b":4,"c":5,"d":6}
],
"g":[
{"b":1,"c":2,"d":3},
{"b":4,"c":5,"d":6}
]
}
我想从“a”和“g”键中的嵌套数组中删除 c 键。是否有一个查询来执行此操作?
解决方案
SELECT
jsonb_object_agg(key, a) -- 5
FROM (
SELECT
mydata,
key,
jsonb_agg(a_elems.value - 'c') as a -- 3/4
FROM
mytable,
jsonb_each(mydata) elems, -- 1
jsonb_array_elements(elems.value) AS a_elems -- 2
GROUP BY mydata, key -- 4
) s
GROUP BY mydata -- 5
- 将 JSON 元素分别展开为一行。这会生成两列:一列用于键,一列用于值(JSON 数组)
- 将 JSON 数组分别展开为一行(分隔要从中删除
c
元素的聚合 JSON 对象) - 您可以使用
-
运算符来删除元素。 - 要重新聚合原始 JSON 对象,您需要将其向后分组。
jsonb_agg()
重新聚合数组 - 最后,您需要
jsonb_object_agg()
使用先前生成的键列和新的数组列重建原始 JSON 对象。
推荐阅读
- laravel - 使用 laravel 背包从表中导出所有数据
- c# - 映射到 SQL Server 列时,如何在 EF Core 3.0 中设置 OwnsOne 属性?
- random - Polkadot 的 VRF 如何实现随机性来洗牌验证者?
- ruby - 忽略文件 Ruby 中的 Lorem Ipsum 文本
- appium - 更新Appium 1.15.0、Xcode 11.1和iOS 13.1.2版本后Safari浏览器测试执行太慢
- python-3.x - TF2.0:如何创建具有 numpy 属性的张量
- haskell - 获取模块导出的列表
- internet-explorer - Internet Explorer 中的 Bootstrap4 问题
- arrays - 从角度js中的对象创建数组
- java - ISPN000476:等待来自请求 73 的响应超时