Во-первых, функция jsonb_array_elements_text()
может использоваться для удаления элементов данных jsonb
, а затем regexp_replace()
может применяться для получения новых jsonb
объектов с общими ключами ("x"
) в подзапросе.
На следующем шаге функция replace()
вместе с jsonb_agg()
даст желаемый результат, как в следующем запросе:
select id,
jsonb_agg(
(replace(jj.value,'}',',')||replace(jsonb_set(value2::jsonb, '{x}',
('"x'||(jj.value2::jsonb->>'x')::text||'"')::jsonb)::text,'{',''))::jsonb
)
as result
from
(
select t.id, j.value, regexp_replace(j.value,'[[:alpha:]]+','x') as value2
from t
cross join jsonb_array_elements_text(jsdata) j
) jj
group by id;
Демонстрация
Действительно, достаточно использовать шаблон '[[:alpha:]]'
для regexp_replace
, знак плюс добавляется для случаев, когда данные будут иметь ключевые значения с более чем одной буквой. .