ОШИБКА: невозможно вызвать jsonb_to_recordset для не-массива (postgresql) - PullRequest
0 голосов
/ 16 июня 2020

в шагах столбца у меня есть json значений, например [{"id":"ali","status":"open","reminder":"tomorrow","show_due_date":"true"}]

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

id | статус | напоминание | show_due_date

Я написал этот скрипт, но получаю ошибку: невозможно вызвать jsonb_to_recordset на не-массиве

WITH series (jsonbrecords) AS (Select steps::jsonb from files)
INSERT INTO new
    (column1,
     column2,
     column3,
     column4)
SELECT  t."id", t."status", t."reminder", t."show_due_date"
  FROM series
 CROSS JOIN LATERAL
 jsonb_array_elements(jsonbrecords) AS x(doc),
 jsonb_to_recordset(x.doc) as t("id" text, "status" text,"reminder" text,"show_due_date" text)

Ответы [ 2 ]

0 голосов
/ 16 июня 2020

Вы деактивируете массив json дважды, один раз с jsonb_array_elements и один раз с jsonb_to_recordset. Вам нужен только один из них, например

INSERT INTO new(column1, column2, column3, column4)
SELECT t."id", t."status", t."reminder", t."show_due_date"
  FROM files f
  CROSS JOIN LATERAL jsonb_to_recordset(f.steps::jsonb) AS t("id" text, "status" text, "reminder" text, "show_due_date" text)
0 голосов
/ 16 июня 2020

Вы можете вывести каждый соответствующий столбец, используя запрос ниже, без необходимости использования другой функции:

SELECT x.doc ->> 'id' AS id, 
       x.doc ->> 'status' AS status,
       x.doc ->> 'reminder' AS reminder, 
       x.doc ->> 'show_due_date' AS show_due_date
  FROM series
 CROSS JOIN LATERAL jsonb_array_elements(jsonbrecords) AS x(doc)

Demo

Вы можете go с этим запросом для вставки в новую таблицу, если вы wi sh:

INSERT INTO new_table(column1,column2,column3,column4)
<the above query>
...