Sql 从Presto中的JSON数组中提取值
我有一个包含JSON数组的列,如下所示:Sql 从Presto中的JSON数组中提取值,sql,arrays,json,presto,trino,Sql,Arrays,Json,Presto,Trino,我有一个包含JSON数组的列,如下所示: {data=[{"name":"col1","min":0,"max":32,"avg":29}, {"name":"col2","min":1,"max":35,"avg":21}, {"name":"col3",&
{data=[{"name":"col1","min":0,"max":32,"avg":29},
{"name":"col2","min":1,"max":35,"avg":21},
{"name":"col3","min":4,"max":56,"avg":34}]}
我试图解析数组并根据条件提取特定值。比如说
“min”
的值,其中“name”=“col1”
:0
“avg”
的值,其中“name”=“col3”
:34
有人对此有解决方案吗?您的JSON无效。它应该是
{“data”:[
不是{data=[
如果JSON有效(您可以在子查询中轻松修复它),则提取数据,将其转换为数组(行)并使用CASE条件语句获取值。我在此处添加了max()聚合以删除空记录并获取单行中的所有必需值,您可以改为使用筛选器(例如其中x.name='col1'
),具体取决于您的需要:
with mydata as (
select '{"data":[{"name":"col1","min":0,"max":32,"avg":29},
{"name":"col2","min":1,"max":35,"avg":21},
{"name":"col3","min":4,"max":56,"avg":34}]}' json
)
select max(case when x.name = 'col1' then x.min end) min_col1,
max(case when x.name = 'col3' then x.avg end) avg_col3
from mydata
CROSS JOIN
UNNEST(
CAST(
JSON_EXTRACT(json,'$.data')
as ARRAY(ROW(name VARCHAR, min INTEGER, max INTEGER, avg INTEGER))
)
) as x(name, min, max, avg) --column aliases
结果:
min_col1 avg_col3
0 34