首页 > 解决方案 > 展开嵌套数组 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 运算符并以多种不同的方式转换结果数据,但我很难弄清楚。非常感谢您的帮助。

标签: sqljsonpostgresqlnestedjsonb

解决方案


使用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'

Db<>小提琴。

阅读有关JSON 函数和运算符的文档。


推荐阅读