sql - 展开嵌套数组 postgres
问题描述
我在一张桌子上有一个 jsonb 列,进度(称之为 t)。它有这样的数据:
{
"2": {
"8": "completed",
"9": "completed",
"10": "completed",
"percent_completed": 0
},
"5": {
"40": "completed",
"percent_completed": 0
}
}
我试图得到一个看起来像的表:
Top Level | Send Level | status
-------------------------------
| 2 | 8 | completed
| 2 | 9 | completed
| 2 | 10 | completed
| 5 | 40 | completed
我正在努力获得一个有效的声明。我快到了(我可以获得顶级列),但我无法获得第二级。这可以提取第一个密钥:
select top_level
, progress
from t
cross join jsonb_object_keys(progress) top_level
然后当我尝试获得第二级时,它不起作用。我正在努力回答为什么:
select top_level
, second_level
, t
from t
cross join jsonb_object_keys(progress) top_level
cross join jsonb_object_keys(progress->top_level) second_level
我收到以下错误:ERROR: cannot call jsonb_object_keys on a scalar
我正在使用 Postgres 11.8
我尝试了不同的 json 运算符并以多种不同的方式转换结果数据,但我很难弄清楚。非常感谢您的帮助。
解决方案
使用jsonb_each()
andjsonb_each_text()
代替jsonb_object_keys()
:
select
t1.key as top_level,
t2.key as send_level,
t2.value as value
from t
cross join jsonb_each(progress) as t1
cross join jsonb_each_text(t1.value) as t2
where t2.key <> 'percent_completed'
阅读有关JSON 函数和运算符的文档。
推荐阅读
- xcode - 如何从 Xcode 中的命令行工具访问 MacOS 安全飞地
- microsoft-graph-api - 如何创建 Microsoft Teams 附带的日历事件链接到在线会议
- html - Bootstrap 按百分比展开菜单/导航栏,如果需要可滚动
- python - Python步进电机最短路径
- android - 如何在 Android 中更改起始目的地动态?
- git - Git合并覆盖我的本地分支文件而不发出合并冲突的信号
- sql - Bulk Loading CSV From Blob Storage to SQL Database
- ios - 解压缩来自服务器的 zip 文件,而不在 ios swift 中本地保存,类似于 android 的操作?
- javascript - 添加更多带有多个选项 JQuery 的问题
- google-apps-script - 在 googlescript 中添加到卡时是否有任何最大部分数