作者热门文章
- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我是 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/
我是一名优秀的程序员,十分优秀!