【问题标题】:Extract values from a JSON Array in Presto从 Presto 中的 JSON 数组中提取值
【发布时间】:2021-05-06 23:43:46
【问题描述】:

我有一列包含如下 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

有没有人可以解决这个问题?

【问题讨论】:

    标签: sql arrays json presto trino


    【解决方案1】:

    您的 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
    

    【讨论】:

      猜你喜欢
      • 2021-03-01
      • 2020-05-16
      • 2019-03-07
      • 2020-11-07
      • 2020-01-21
      • 2020-09-25
      • 2019-06-24
      • 2020-04-18
      • 1970-01-01
      相关资源
      最近更新 更多