postgresql - Postgres jsonb:查询多级
问题描述
在 Postgres (9+) 表中,有一列类型jsonb
如下json
:
{
"dynamicFields":[
{
"name":"040",
"subfields":[
{
"name":"a",
"value":"abc"
},
{
"name":"a",
"value":"xyz"
}
]
}
]
}
我想编写一个查询,只返回字段名称等于040
和子字段a
等于的行xyz
。
到目前为止,这是我所得到的:
select e.obj from my_table
cross join lateral jsonb_array_elements(my_column-> 'dynamicFields') as e(obj)
where e.obj ->> 'name' = '040' and e.obj ->> 'subfields' @> '{"name": "a", "value": "xyz"}'::jsonb
这个查询应该如何实现这一点?
解决方案
e.obj ->> 'subfields'
有text
结果。您将希望使用e.obj -> 'subfields'
它返回运算符工作的jsonb
值@>
。此外,包含检查需要将另一个数组作为右侧,以便它测试右侧数组中的所有值是否都包含在左侧数组中 - 直接传递元素对象是行不通的。
select e.obj from my_table
cross join lateral jsonb_array_elements(my_column-> 'dynamicFields') as e(obj)
where e.obj ->> 'name' = '040' and e.obj -> 'subfields' @> '[{"name": "a", "value": "xyz"}]'::jsonb
-- ^ ^ ^
(在线演示)
推荐阅读
- sql - 如何使用 SQL MERGE 删除重复项并更新数据?
- php - 根据内容处理TXT文件
- oracle - 在Oracle中编写基于FIFO调整表中值的逻辑
- javascript - 在javascript中勾选工作日的复选框
- python - 为什么 conda 命令在 Windows Powershell 但在 Anaconda PowerShell Prompt 中不显示任何输出?
- ios - 为什么我们在 Apple 的“使用场景深度可视化点云”示例代码中需要“rotateToARCamera”?
- arrays - 在插入数组时,做 n++ 会增加数组的大小吗?它实际上是否为数组分配了额外的传染性内存位置?
- azure-devops-extensions - Azure DevOps 扩展占位符
- image-processing - 你如何在 kaggle 中使用 GPU 和 TPU?
- python - Anaconda 版本更新不起作用(Windows)