Преобразовать объект JSON в набор записей? - PullRequest
0 голосов
/ 13 ноября 2018

Используя Postgres 11, как я могу преобразовать этот объект JSON (с текстовым индексом и целыми числами в качестве значений)

{"a":{"col1":1,"col2":2,"col3":3}
,"b":{"col1":4,"col2":5,"col3":6}
,"c":{"col1":7,"col2":8,"col3":9}}

в набор записей, например:

r_id | col1 | col2 | col3
-------------------------
   a |    1 |    2 |    3
   b |    4 |    5 |    6
   c |    7 |    8 |    9

Ответы [ 2 ]

0 голосов
/ 14 ноября 2018

Ваше решение кажется достаточно хорошим только для трех столбцов значений.

При большем количестве столбцов 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}]');
0 голосов
/ 13 ноября 2018
SELECT key AS r_id, value->>'col1' AS col1, value->>'col2' AS col2, value->>'col3' AS col3
FROM JSON_EACH('{"a":{"col1":1,"col2":2,"col3":3},"b":{"col1":4,"col2":5,"col3":6},"c":{"col1":7,"col2":8,"col3":9}}');
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...