Redshift Postgresql - Как разобрать вложенный JSON - PullRequest
0 голосов
/ 11 февраля 2020

Я пытаюсь проанализировать текст JSON с помощью функции JSON_EXTRACT_PATH_TEXT (). JSON sample:

{ 
   "data":[ 
      { 
         "name":"ping",
         "idx":0,
         "cnt":27,
         "min":16,
         "max":33,
         "avg":24.67,
         "dev":5.05
      },
      { 
         "name":"late",
         "idx":0,
         "cnt":27,
         "min":8,
         "max":17,
         "avg":12.59,
         "dev":2.63
      }
   ]
}
'

Я пытался JSON_EXTRACT_PATH_TEXT (событие, '{"name": "late"}', 'avg') функция для получения 'avg' для имени = "поздно", но возвращается пустым. Кто-нибудь может помочь, пожалуйста? Спасибо

Ответы [ 2 ]

1 голос
/ 11 февраля 2020

Это довольно сложная задача в Redshift, которая, в отличие от Postgres, имеет плохую поддержку для управления JSON и не имеет функции для удаления массивов.

Вот одна способ сделать это с помощью таблицы номеров; вам нужно заполнить таблицу увеличивающимися числами, начиная с 0, например:

create table nums as
    select 0 i union all select 1 union all select 2 union all select 3 
    union all select 4 union all select 5 n union all select 6 
    union all select 7 union all select 8 union all select 9
;

После того, как таблица создана, вы можете пройтись по массиву JSON, используя json_extract_array_element_text(), и проверить ее содержание с json_extract_path_text():

select json_extract_path_text(item, 'avg') as my_avg
from (
    select json_extract_array_element_text(t.items, n.i, true) as item
    from (
        select json_extract_path_text(mycol, 'data', true ) as items
        from mytable
    ) t
    inner join nums n on n.i < json_array_length(t.items, true)
) t
where json_extract_path_text(item, 'name') = 'late';
1 голос
/ 11 февраля 2020

Для этого вам нужно будет использовать json_array_elements:

select obj->'avg'
  from foo f, json_array_elements(f.event->'data') obj 
where obj->>'name' = 'late';

Рабочий пример

create table foo (id int, event json);
insert into foo values (1,'{ 
   "data":[ 
      { 
         "name":"ping",
         "idx":0,
         "cnt":27,
         "min":16,
         "max":33,
         "avg":24.67,
         "dev":5.05
      },
      { 
         "name":"late",
         "idx":0,
         "cnt":27,
         "min":8,
         "max":17,
         "avg":12.59,
         "dev":2.63
      }]}');
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...