?
pg 13
Т.е. я хочу сделать flatten jsonb array и его в array of jsonb scalars
Исходный массив у меня всегда гарантированно двойной вложенности
не уверен на счёт правильности решения, но возможно натолкнёт на решение: with tr_data as ( select '[[], [1, 2], [3]]'::jsonb as mm ), unn1 as ( select jsonb_array_elements(jsonb_array_elements(mm)) as n from tr_data a) select array_agg(n)::jsonb[] from unn1;
Похоже на то что нужно. Сейчас посмотрю
Вот так добился желаемого результата, но очень смущает cross join with my_jsonb_table as ( select unnest(array['[[], [1, 2], [3]]'::jsonb, '[[4, 5], [6], []]'::jsonb]) as val ) select (select array_agg(values) from jsonb_array_elements(my_jsonb_table.val) as elements cross join jsonb_array_elements(elements) as values) from my_jsonb_table; array_agg ----------- {1,2,3} {4,5,6} (2 rows)
можно вот так с row_number и без джоина. with tr_data as ( select unnest(array['[[], [1, 2], [3]]'::jsonb, '[[4,5],[6],[]]'::jsonb]) as mm ), unn1 as ( select jsonb_array_elements(mm) as n, row_number() over() vv from tr_data a), unn2 as ( select jsonb_array_elements(n) as n, vv from unn1 a) select vv, array_agg(n)::jsonb[] from unn2 group by vv; vv | array_agg ----+----------- 2 | {4,5,6} 1 | {1,2,3}
А что лучше group by или cross join?...
а твой пример с кросс джоином с тремя записями норм сработает?
ну я хз что лучше. в sql всегда есть множество разных способов решить задачу. если интересует скорость то лучше всего покажут замеры.
Ну сейчас меня скорость не удовлетворила. Попытаюсьсделать и через group by
Раз уж v13, то почему бы не: WITH my_jsonb_table AS ( SELECT unnest(ARRAY['[[], [1, 2], [3]]'::jsonb, '[[4, 5], [6], []]'::jsonb]) AS val ) SELECT val, jsonb_path_query_array(val, '$[*][*]') FROM my_jsonb_table;
ВОУ! Это самое лучшее решение для меня
Обсуждают сегодня