Очистка вложенного столбца JSON - PullRequest
0 голосов
/ 24 июня 2019

Мне нужна помощь в очистке столбца JSON. Это запрос, который у меня есть

select json_extract_path_text(response_text,'rule') from live.qamatha_responses limit 20

Это столбец, который я пытаюсь очистить:

[{"ruleSet":"ccc","rule":"ERROR MESSAGE -- 3.2.1","business-identity-match-failed":"Businessname","approved":true,"requirements":[{"key":"business-match-failed","value":"Businessname okay","type":"text"}]}]

1 Ответ

0 голосов
/ 25 июня 2019

Сложность, с которой вы сталкиваетесь, заключается в том, что вам нужно expload входного массива json в отдельные строки. Redshift не имеет встроенной поддержки для этого, поэтому вам придется прибегнуть к менее очевидным решениям.

input - это таблица, содержащая столбец массива json, который вы хотите очистить. Я продублировал входной массив, содержащий 2 объекта json (в вашем примере у массива был только один объект).

seq - вспомогательная таблица, которую мы будем использовать для перекрестного соединения с input. Он должен содержать как минимум столько строк, сколько длина вашего массива json.

exploaded_input - это таблица, которая содержит один объект json из массива в одной строке.

Надеюсь, теперь все ясно.

with input as (
    select '[{"ruleSet":"ccc","rule":"ERROR MESSAGE -- 3.2.1","business-identity-match-failed":"Businessname","approved":true,"requirements":[{"key":"business-match-failed","value":"Businessname okay","type":"text"}]}, {"ruleSet":"ccc","rule":"ERROR MESSAGE -- 3.2.1","business-identity-match-failed":"Businessname","approved":true,"requirements":[{"key":"business-match-failed","value":"Businessname okay","type":"text"}]}]'::text as response_text
), seq as (
    select row_number() over ()::int - 1 as i
    from (
             select 1 union all
             select 1 union all
             select 1 union all
             select 1 union all
             select 1
         ) as s
),
 exploaded_input as (
     select json_extract_array_element_text(response_text, seq.i) as response_text
     from input cross join seq
     where json_array_length(response_text) > seq.i
 )

select json_extract_path_text(response_text,'rule') as rule from exploaded_input

возвращается:

rule
ERROR MESSAGE -- 3.2.1
ERROR MESSAGE -- 3.2.1
...