扩展嵌套数组postgres

时间:2020-09-04 01:47:21

标签: sql json postgresql nested jsonb

我在表上有一个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运算符,并以多种不同的方式转换结果数据,但我一直在努力弄清楚。非常感谢您的帮助。

1 个答案:

答案 0 :(得分:1)

使用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.的文档