Redshift вложенный JSON извлечения - PullRequest
0 голосов
/ 23 октября 2019

У меня есть таблица с двумя столбцами, один столбец с именем user, один столбец json с именем js, который выглядит следующим образом:

{"1":{"partner_id":54,"provider_id":13},

"2":{"partner_id":56,"provider_id":8},

"3":{"partner_id":2719,"provider_id":274}}

Я хочу выбрать все 'provider_id' в одном столбце/row.Так это должно выглядеть так:

user| provider_ids
0001| 13,8,274
0002| 21,36,57,12

Как я могу это сделать? Заранее спасибо!

1 Ответ

0 голосов
/ 29 октября 2019

С предоставленным вами форматом json не так легко работать.

Ящик таблицы для целей тестирования:

create table json_test as
select '0001' as usr, '{"1":{"partner_id":54,"provider_id":13},
"2":{"partner_id":56,"provider_id":8},
"3":{"partner_id":2719,"provider_id":274}}'
as json_text
union all
select '0002' as usr, '{"1":{"partner_id":54,"provider_id":21},
"2":{"partner_id":56,"provider_id":36},
"2":{"partner_id":56,"provider_id":57},
"3":{"partner_id":2719,"provider_id":12}}'
as json_text;

Запрос на возврат результатов:

with NS AS (
  select 1 as n union all
  select 2 union all
  select 3 union all
  select 4 union all
  select 5 union all
  select 6 union all
  select 7 union all
  select 8 union all
  select 9 union all
  select 10
)
select usr,
 listagg(trim(TRIM(split_part(SPLIT_PART(js.json_text, '},', NS.n),'"provider_id":',2)),'}'),',') within group(order by null) AS t
from NS
join json_test js ON true and NS.n <= REGEXP_COUNT(js.json_text, '\\},') + 1
group by usr;

Примечания:

1) не называйте столбец "пользователь", так как это зарезервированное ключевое слово

2) добавьте столько пустых строк в подзапросе NS, сколько существует максимум записей провайдера json

3) Да, я знаю, это не очень читаемый SQL: D

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...