Сложность, с которой вы сталкиваетесь, заключается в том, что вам нужно 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