как разобрать json с помощью json_populate_recordset в postgres

У меня есть json, хранящийся в виде текста в одной из строк моей базы данных. данные json следующие

[{"id":67272,"name":"EE_Quick_Changes_J_UTP.xlsx"},{"id":67273,"name":"16167.txt"},{"id":67274,"name":"EE_12_09_2013_Bcum_Searchall.png"}]

чтобы разобрать это, я хочу использовать метод postgresql

json_populate_recordset()

когда я отправляю команду типа

select json_populate_recordset(null::json,'[{"id":67272,"name":"EE_Quick_Changes_J_UTP.xlsx"},{"id":67273,"name":"16167.txt"},{"id":67274,"name":"EE_12_09_2013_Bcum_Searchall.png"}]') from anoop;

это дает мне следующую ошибку: первый аргумент json_populate_recordset должен быть типом строки

примечание: в предложении from "anoop" указано имя таблицы.

может ли кто-нибудь предложить мне, как использовать метод json_populate_recordset для извлечения данных из этой строки json.

Я получил ссылку на метод из http://www.postgresql.org/docs/9.3/static/functions-json.html


person kenthewala    schedule 11.09.2014    source источник


Ответы (2)


Первый аргумент, передаваемый функции pgsql json_populate_recordset, должен быть типом строки. Если вы хотите использовать массив json для заполнения существующей таблицы anoop, вы можете просто передать таблицу anoop в качестве типа строки следующим образом:

insert into anoop
select * from json_populate_recordset(null::anoop, 
        '[{"id":67272,"name":"EE_Quick_Changes_J_UTP.xlsx"},
          {"id":67273,"name":"16167.txt"},
          {"id":67274,"name":"EE_12_09_2013_Bcum_Searchall.png"}]');

Здесь null — это значение по умолчанию для вставки в столбцы таблицы, не заданные в переданном json.

Если у вас нет существующей таблицы, вам нужно создать тип строки для хранения данных json (т. е. имен столбцов и их типов) и передачи их в качестве первого параметра, например anoop_type:

create TYPE anoop_type AS (id int, name varchar(100));
select * from json_populate_recordset(null :: anoop_type, 
        '[...]') --same as above
person jediKnight    schedule 04.11.2014
comment
Это первый ответ, который я нашел, который распаковывает null::anoop на простом английском языке. Спасибо! Тем не менее, я не понимаю значение нуля, поскольку большинство записей имеют много типов данных. Помимо нуля, какие другие значения по умолчанию мы могли бы предоставить для записи, ожидающей строки, uuid и целые числа? - person Wellspring; 25.07.2020

нет необходимости создавать для этого новый тип.

select * from json_populate_recordset(null::record,'[{"id_item":1,"id_menu":"34"},{"id_item":2,"id_menu":"35"}]')
 AS
 (
    id_item int
    , id_menu int
 )
person Yarex    schedule 15.03.2019
comment
Если я запрошу из таблицы, какой будет синтаксис для этого без использования типа создания - person Souvik; 30.01.2020
comment
ОШИБКА: тип записи не зарегистрирован - person Nishant Ghodke; 04.06.2020
comment
Меня всегда забавляет, когда к 5-летнему вопросу есть комментарии всего на несколько недель старше, чем мой первый визит... - person Wellspring; 25.07.2020