Вы можете использовать функцию json_to_recordset
для преобразования JSON в набор строк. В любом случае, окончательный набор строк не может иметь динамическое c количество столбцов, т.е. какое бы решение вы ни выбрали, вам придется каким-то образом перечислить их явно.
Например, в предложении select при выполнении ручной транспозиции 1: 1 -converted JSON:
with t(d) as (values
('{"elements":[{"val":"value1", "column":"column1"}, {"val":"val2", "column":"column2"}]}'::json)
), matrix(val,col) as (
select x.val, x."column"
from t
inner join lateral json_to_recordset((t.d->>'elements')::json) as x(val text, "column" text) on true
)
select (select val from matrix where col = 'column1') as column1
, (select val from matrix where col = 'column2') as column2
Или в предложении as x(column1 text, column2 text)
при использовании расширения crosstab
(см. этот вопрос ).
Или как-то преобразовано или преобразованный в xml JSON.