json - 对存储在 Postgres 中的 jsonb 数据进行递归查询
问题描述
我在 postgres 中有一个名为“books”的表,其中有一个名为“j”的 jsonb 列,其中包含以下数据:
{
"entity": "Book",
"processes": [
{ "process": [
{ "processname": "Buy",
"option": "none",
"processes": [
{ "process": [
{ "processname": "Order",
"option": "none"
}
]
},
{ "process": [
{ "processname": "Arrive",
"option": "none"
}
]
},
{ "process": [
{ "processname": "Enter",
"option": "none"
}
]
}
]
}
]
},
{ "process": [
{ "processname": "Use",
"option": "none",
"processes": [
{ "process": [
{ "processname": "Lend",
"option": "*",
"processes": [
{
"process": [
{
"processname": "Borrow",
"option": "none"
}
]
},
{
"process": [
{
"processname": "Return",
"option": "none"
}
]
}
]
}
]
}
]
}
]
},
{ "process": [
{ "processname": "Scrap",
"option": "none",
"processes": [
{ "process": [
{ "processname": "Sold",
"option": "0"
}
]
},
{ "process": [
{ "processname": "Scrap",
"option": "0"
}
]
}
]
}
]
}
]
}
我想检索所有进程名以及他们父母的进程名(即到达他们的路径)。
到目前为止,我有以下代码,但联合部分不起作用。
with recursive jsonrecursion as
(
select process -> 'processname' as processname, '{}'::int[] as superior, 0 as lv
from books, jsonb_array_elements(j-> 'processes') processes, jsonb_array_elements(processes-> 'process') process
where process -> 'processes' is NULL
union all
select process -> 'processname' as processname, superior || process -> 'processname', lv+1
from books, jsonrecursion
where not process -> 'processname' = any(superior)
)
SELECT processname, superior, lv
FROM jsonrecursion;
有人可以帮忙吗?谢谢
解决方案
推荐阅读
- python - AttributeError:在 xlwings python 中更改字体颜色时
- neo4j - 日期时间比较查询不返回任何结果
- symfony - 为什么 Symfony 5 控制器必须扩展 AbstractController 才能使自动装配工作?
- javascript - 尝试根据日期范围查询数据库不起作用吗?
- python - 如何在我的 MAC 上使用 pip 而不是 python3 pip?
- python-3.x - M2Crypto.SMIME.PKCS7_Error:没有内容
- java - 运行 Scala 程序时出错:在 main 类中找不到 Main 方法,请定义 main 方法
- python - sqlalchemy 定义计算列
- javascript - Vue:单击按钮重置选定的表单
- c++ - 有什么办法可以找出什么叫“__lll_lock_wait_private”