postgresql - Postgresql 从 JSONB 字段中的嵌套对象数组中获取键
问题描述
这是 jsonb 列的虚拟数据
{
"address": [
{
"country": "US",
"extension": [
{
"extension": [
{
"valueDecimal": -71.024638,
"url": "latitude"
},
{
"url": "longitude",
"valueDecimal": 42.082543
}
],
"url": "url1"
}
],
"postalCode": "02301",
"city": "Brockton"
},
{
"country": "US",
"extension": [
{
"extension": [
{
"valueDecimal": -71.024638,
"url": "latitude"
},
{
"url": "longitude",
"valueDecimal": 42.082543
}
],
"url": "url2"
}
],
"postalCode": "02301",
"city": "Brockton"
}
]
}
我想得到类似的东西,address->'extension'->'extension'->'valueDecimal'
但它只适用于 json,但它是 JSON 数据数组......我期待的输出 -
[-71.024638, -71.024638]
我可以通过以下查询获得第一个扩展名(即 JSON 的第一个数组)
SELECT elems.value FROM "patient", jsonb_array_elements(resource -> 'extension') AS elems;
所以问题是我无法获得内部“扩展”(它在扩展对象内部)数据。任何帮助都会有所帮助。
解决方案
您可以交叉加入多个级别的jsonb_array_elements
SELECT json_agg(elems3->>'valueDecimal') as latitudes
FROM patient
cross join jsonb_array_elements(resource ->'address' ) AS elems
cross join jsonb_array_elements(elems ->'extension') AS elems2
cross join jsonb_array_elements(elems2 ->'extension') AS elems3
where elems3->>'url' = 'latitude'
尽管有一些方法可以提高性能,但对于大型记录,这可能会更慢。推荐的选项是重新设计和规范化您的表,以将值作为列单独存储在相应表中,并JSON
仅在没有其他方法处理数据的情况下使用。
推荐阅读
- docker - 有没有办法找出用于构建映像的 docker 版本?
- android - 阅读收件箱中的所有短信或将其发送到 React NATIVE 中的服务器
- python - pysftp 身份验证超时
- flutter - 如何使用 BuildContext 判断页面是否已被释放
- sql - PostgreSQL 中的无方向关系失败
- java - 使用嵌入式 H2 的 Spring Boot 测试执行 10 倍于 init 脚本
- sql - 使用 SQL 查询从新列中的表中提取值
- python - 将 curl 转换为 python 请求,包括 cookie
- python - 如何在给定条件下选择两个数组的元素?
- react-native - react-native-chart-kit 条形图图形切割