Postgresql json列出了值提取

问题描述 投票:0回答:1

我在一个带有示例值的表中跟随jsonb列:

{
    "persons": [
        {
            "person": [
                {"id": "1", "name": "John"}
            ]
        },         
        {
            "person": [
                {"id": "2", "name": "Oscar"}
            ]
        }
    ]
}

有没有办法用1-John, 2-Oscar创建行值?假设每行没有固定数量的人。

我尝试了几个函数和交叉连接,但没有任何效果。

json postgresql
1个回答
2
投票

由于您有两个嵌套数组,因此需要将它们取消两次:

with data (doc) as (
values ('{
        "persons": 
        [
        {"person": [{"id": "1", "name": "John"}]},         
        {"person": [{"id": "2", "name": "Oscar"}]}
        ]}'::jsonb)
)
select t2.p ->> 'id' as id, 
       t2.p ->> 'name' as name
from data, 
     jsonb_array_elements(doc -> 'persons') as t1(p),
     jsonb_array_elements(t1.p -> 'person') as t2(p);

收益:

id | name 
---+------
1  | John 
2  | Oscar

要将其连接成一行,请使用string_agg()

with (...) 
select string_agg(concat_ws('-', t2.p ->> 'id', t2.p ->> 'name'), ', ')
from ...

收益:

string_agg     
---------------
1-John, 2-Oscar
© www.soinside.com 2019 - 2024. All rights reserved.