扩展嵌套数组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()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.的文档