gpt4 book ai didi

postgresql - 在没有未知深度和未知关键字段的情况下递归展平 postgres 中的嵌套 jsonb

转载 作者:行者123 更新时间:2023-11-29 11:41:17 27 4
gpt4 key购买 nike

我不知道深度和每个深度的字段,如何在 postgres 中递归地展平嵌套的 jsonb? (见下面的例子)

执行扁平化的 postgressql 查询将非常受欢迎

    {
"xx": "",
"xx": "",
"form": "xxx",
"type": "",
"content_type": "xxx",
"reported_date": ,
"contact": {
"imported_date": "",
"name": "",
"phone": "",
"alternate_phone": "",
"specialization": "",
"type": "",
"reported_date": ,
"parent": {
"_id": "xxx",
"_rev": "xxx",
"parent": "",
"type": "xxx"
}
}
}

我在堆栈溢出中搜索过,但他们只考虑具有单一深度且键之前已知的 jsonb

最佳答案

示例设置:

create table my_table(id int, data jsonb);
insert into my_table values
(1,
$${
"type": "a type",
"form": "a form",
"contact": {
"name": "a name",
"phone": "123-456-78",
"type": "contact type",
"parent": {
"id": "444",
"type": "parent type"
}
}
}$$);

递归查询对在任何级别上找到的每个 json 对象执行 jsonb_each()。新键名包含从根开始的完整路径:

with recursive flat (id, key, value) as (
select id, key, value
from my_table,
jsonb_each(data)
union
select f.id, concat(f.key, '.', j.key), j.value
from flat f,
jsonb_each(f.value) j
where jsonb_typeof(f.value) = 'object'
)
select id, jsonb_pretty(jsonb_object_agg(key, value)) as data
from flat
where jsonb_typeof(value) <> 'object'
group by id;

id | data
----+------------------------------------------
1 | { +
| "form": "a form", +
| "type": "a type", +
| "contact.name": "a name", +
| "contact.type": "contact type", +
| "contact.phone": "123-456-78", +
| "contact.parent.id": "444", +
| "contact.parent.type": "parent type"+
| }
(1 row)

如果您想获得此数据的平面 View ,您可以使用此答案 Flatten aggregated key/value pairs from a JSONB field? 中描述的函数 create_jsonb_flat_view()

您需要使用扁平化的 jsonb 创建表(或 View ):

create table my_table_flat as 
-- create view my_table_flat as
with recursive flat (id, key, value) as (
-- etc as above
-- but without jsonb_pretty()

现在你可以使用表上的函数了:

select create_jsonb_flat_view('my_table_flat', 'id', 'data');

select * from my_table_flat_view;


id | contact.name | contact.parent.id | contact.parent.type | contact.phone | contact.type | form | type
----+--------------+-------------------+---------------------+---------------+--------------+--------+--------
1 | a name | 444 | parent type | 123-456-78 | contact type | a form | a type
(1 row)

该解决方案适用于 Postgres 9.5+,因为它使用了此版本中引入的 jsonb 函数。如果您的服务器版本较旧,强烈建议升级 Postgres 以有效地使用 jsonb。

关于postgresql - 在没有未知深度和未知关键字段的情况下递归展平 postgres 中的嵌套 jsonb,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45585462/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com