gpt4 book ai didi

Postgresql jsonb遍历

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

我是 PG jsonb 领域的新手。例如,我有一个包含以下内容的 jsonb 字段

{
"RootModule": {
"path": [
1
],
"tags": {
"ModuleBase1": {
"value": 40640,
"humanstring": "40640"
},
"ModuleBase2": {
"value": 40200,
"humanstring": "40200"
}
},
"children": {
"RtuInfoModule": {
"path": [
1,
0
],
"tags": {
"in0": {
"value": 11172,
"humanstring": "11172"
},
"in1": {
"value": 25913,
"humanstring": "25913"
}
etc....

有没有一种方法可以深入查询 X 级别并在“tags”键中搜索某个键。

假设我想要“ModuleBase2”和“in1”并且我想获取它们的值?

基本上我正在寻找一个查询,它将遍历一个 jsonb 字段,直到它找到一个键并返回值,而无需知道结构。

在 Python 或 JS 中,一个简单的循环或递归函数可以很容易地遍历一个 json 对象(或字典),直到它找到一个键。

是否有内置函数 PG 必须这样做?

最终我想在 django 中做这个。

编辑:我知道我可以做类似的事情

SELECT data.key AS key, data.value as value 
FROM trending_snapshot, jsonb_each(trending_snapshot.snapshot-
>'RootModule') AS data
WHERE key = 'tags';

但我必须指定级别。

最佳答案

您可以使用递归查询来展平嵌套的 jsonb,请参阅 this answer.修改查询以查找特定键的值(在 where 子句中添加条件):

with recursive flat (id, path, value) as (
select id, key, value
from my_table,
jsonb_each(data)
union
select f.id, concat(f.path, '.', j.key), j.value
from flat f,
jsonb_each(f.value) j
where jsonb_typeof(f.value) = 'object'
)
select id, path, value
from flat
where path like any(array['%ModuleBase2.value', '%in1.value']);

id | path | value
----+--------------------------------------------------+-------
1 | RootModule.tags.ModuleBase2.value | 40200
1 | RootModule.children.RtuInfoModule.tags.in1.value | 25913
(2 rows)

SqlFiddle. 中测试它

关于Postgresql jsonb遍历,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46718006/

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