展开嵌套数组 postgres

Expand nested arrays postgres

我有一个 jsonb 专栏,进度,在 table 上(称之为 t)。它有这样的数据:

{
    "2": {
        "8": "completed",
        "9": "completed",
        "10": "completed",
        "percent_completed": 0
    },
    "5": {
        "40": "completed",
        "percent_completed": 0
    }
}

我正在尝试 table 看起来像:

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()jsonb_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<>fiddle.

阅读有关 JSON Functions and Operators.

的文档