Как написать запрос SQL, который использует формат JSON таблицы a_ json для заполнения таблицы b соответствующими значениями в postgresql - PullRequest
0 голосов
/ 26 мая 2020

У меня есть файл с именем data. json. Структура выглядит так:

 {  "PrimKey1": {    "layout": "normal",    "col1": "PrimKey1",   
 "__colll2__": "sometext",    "col3": 9, "OTHERCOLUMN":"dontneedthis", "col4": ["texxt"] }, 
 ... ,
 {"PrimKey500": {    "layout": "normal",    "col1": "PrimKey500",   
 "col2": "someothertext",    "col3": 1,  "col4": ["texxtagain"] }}

Данные загружаются в таблицу a_ json с:

CREATE TABLE a_json (
  data json
);

\copy a_json FROM 'mypath/data.json/';

Поскольку таблица не в ожидаемом формате, я создаю новый таблица с именем b.

CREATE TABLE b (
  col1      text PRIMARY KEY,
  col2 text,
  col3 numeric,
  col4 text
);

, где столбцы названы в честь столбцов, которые мне нужны из данных. json.

Теперь я хочу вставить все из таблицы a_ json в б. Я попробовал

INSERT INTO b
SELECT * from a_json json_each(data);

и получил

ОШИБКА: для строки индекса требуется 1945656 байт, максимальный размер - 8191

1 Ответ

1 голос
/ 26 мая 2020

Для этого вы можете просто использовать аксессоры json_each() и json:

insert into b(col1, col2, col3, col4)
select j.v ->> 'col1', j.v ->> 'col2', (j.v ->> 'col3')::numeric, j.v ->> 'col4'
from a_json a
cross join lateral json_each(a.data) j(k, v)

Демо на DB Fiddle :

col1       | col2          | col3 | col4          
:--------- | :------------ | ---: | :-------------
PrimKey1   | sometext      |    9 | ["texxt"]     
PrimKey500 | someothertext |    1 | ["texxtagain"]
...