从 Presto 中的 JSON 数组中提取值
Extract values from a JSON Array in Presto
我有一个包含 JSON 数组的列,如下所示:
{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() 聚合以删除 NULL 记录并在单行中获取所有必需的值,您可以改用过滤器(例如 where 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
我有一个包含 JSON 数组的列,如下所示:
{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() 聚合以删除 NULL 记录并在单行中获取所有必需的值,您可以改用过滤器(例如 where 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