Вернуть элементы столбца массива JSON в отдельных строках в Redshift - PullRequest
1 голос
/ 13 января 2020

У меня есть таблица Redshift с массивом JSON в одном столбце:

 id | metadata
---------------------------------------------------------------------------
 1  | [{"pet":"dog","country":"uk"}, {"pet":"cat","country":"us"}]
 2  | [{"pet":"cat","country":"uk"}]
 3  | []

Мне нужна таблица, которая выглядит следующим образом:

 id |   pet   |  country
------------------------
 1  | dog       | uk
 1  | cat       | us
 2  | cat       | uk

Есть ли способ чтобы сделать это, используя sql команды и или python пользовательские функции в таблице Redshift

Ответы [ 2 ]

0 голосов
/ 13 января 2020

Я использую этот (безобразный) метод для Redshift. Пусть seq будет таблицей с одним полем num, содержащим числа от 1 до 10000 (предположим, что у вас не более 10000 питомцев в одном ряду). Вы можете использовать generate_series(1, 10000), но по странным причинам это медленнее: (

select
  id,
  JSON_EXTRACT_PATH_TEXT(single_metadata, 'pet') as pet,
  JSON_EXTRACT_PATH_TEXT(single_metadata, 'country') as country
from
(
  select
    t.id,
    cast(JSON_EXTRACT_ARRAY_ELEMENT_TEXT(t.metadata, num) as json) as single_metadata
  from 
    t join seq -- or (select num from generate_series(1, 10000))
  on num <= json_array_length(t.metadata)
)
0 голосов
/ 13 января 2020

Вы можете сделать cross join lateral с json_to_recordset():

select t.id, x.pet, x.country
from 
    mytable t
    cross join lateral json_to_recordset(t.metadata) as x(pet text, country text)
;

Демонстрация на DB Fidde :

id | pet | country
-: | :-- | :------
 1 | dog | uk     
 1 | cat | us     
 2 | cat | uk     

Редактировать : Redshift не поддерживает json_to_recordset(). Это должно работать:

select 
    t.id, 
    json_extract_path_text(json_extract_array_element_text(t.metadata, n.n), 'pet') pet,
    json_extract_path_text(json_extract_array_element_text(t.metadata, n.n), 'country') country
from mytable t
cross join lateral generate_series(0, json_array_length(t.metadata) - 1) as n(n)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...