Ваше решение кажется достаточно хорошим только для трех столбцов значений.
При большем количестве столбцов json_populate_record()
сократит синтаксис и сделает его немного быстрее. Тем не менее, он основан на типе строки шаблона, которого у вас нет. Вы можете легко предоставить это, создав временную таблицу (видимую внутри сеанса до конца сеанса):
CREATE TEMP TABLE t1(col1 int, col2 int, col3 int);
SELECT key AS r_id, (json_populate_record(null::t1, value)).*
FROM json_each('{"a":{"col1":1,"col2":2,"col3":3}
, "b":{"col1":4,"col2":5,"col3":6}
, "c":{"col1":7,"col2":8,"col3":9}}')
Если ваш JSON-документ представляет собой массив записей, вы можете использовать json_populate_recordset()
:
CREATE TEMP TABLE t2(r_id text, col1 int, col2 int, col3 int);
SELECT *
FROM json_populate_recordset(null::t2
, '[{"r_id":"a","col1":1,"col2":2,"col3":3}
, {"r_id":"b","col1":4,"col2":5,"col3":6}
, {"r_id":"c","col1":7,"col2":8,"col3":9}]');