【发布时间】:2021-04-26 18:47:12
【问题描述】:
该表有一个 id 和 step_data 列。
id | step_data
--------------
a1 | {...}
a2 | {...}
a3 | {...}
其中step_data是如下嵌套结构,其中元数据的实际键可以在events对象中。
{
"events": [
{
"timestamp": "2021-04-07T17:46:13.739Z",
"meta": [
{
"key": "length",
"value": "0.898"
},
{
"key": "height",
"value": "607023104"
},
{
"key": "weight",
"value": "33509376"
}
]
},
{
"timestamp": "2021-04-07T17:46:13.781Z",
"meta": [
{
"key": "color",
"value": "0.007"
},
{
"key": "count",
"value": "641511424"
},
{
"key": "age",
"value": "0"
}
]
}
]
}
我可以很容易地提取像length 这样的一个字段。
select cast(metadata ->> 'value' as double precision) as length,
id
from (
select jsonb_array_elements(jsonb_array_elements(step_data #> '{events}') #> '{meta}') metadata,
id
from table
) as parsed_keys
where metadata @> '{
"key": "length"
}'::jsonb
| id | length |
|---|---|
| a1 | 0.898 |
| a2 | 0.800 |
但我真正需要的是从几个已知键中提取元数据作为列,例如length 和color。不确定如何在使用jsonb_array_elements() 拆分数组后有效地获取另一列。
有没有一种有效的方法来做到这一点,而不必再次致电jsonb_array_elements() 并加入每个人?例如,结果集如下所示。
| id | length | color | weight |
|---|---|---|---|
| a1 | 0.898 | 0.007 | 33509376 |
| a2 | 0.800 | 1.000 | 15812391 |
使用 Postgres 11.7。
【问题讨论】:
-
如果
meta数组元素中的键不是唯一的怎么办?例如。你有多个color?像这样的东西:pastebin.com/m5Lbn3c6 -
@a_horse_with_no_name 使用 PG 11.7 顺便说一句。并且查询可以假设每个 JSON 结构只有一个键。如果有多个,那么让查询快速失败会很好。
标签: sql json postgresql crosstab