我在一个带有示例值的表中跟随jsonb
列:
{
"persons": [
{
"person": [
{"id": "1", "name": "John"}
]
},
{
"person": [
{"id": "2", "name": "Oscar"}
]
}
]
}
有没有办法用1-John, 2-Oscar
创建行值?假设每行没有固定数量的人。
我尝试了几个函数和交叉连接,但没有任何效果。
由于您有两个嵌套数组,因此需要将它们取消两次:
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