这是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;
所以问题是我无法获取内部“扩展”(位于扩展对象内部)数据。任何帮助都会有帮助。
答案 0 :(得分:1)
您可以交叉加入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
。