Извлечение значений из массива JSON в 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

У кого-нибудь есть решение для этого?


person ali60vip    schedule 02.02.2021    source источник


Ответы (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
person leftjoin    schedule 02.02.2021