#sql #json #postgresql #api #object
#sql #json #postgresql #API #объект
Вопрос:
У меня есть данные в этом формате:
[{"id":"b","type":"user"},{"id":"c","type":"system"}]
Хотелось бы сгенерировать сообщение JSON с выбранным только «id», например:
[{"id":"b"},{"id":"c"}]
До сих пор я мог только разделить их и удалить «тип», а затем объединить с помощью []
select json_array_elements_text(column1)::jsonb #- '{type}'
from (
select '[{"id":"b","type":"user"},{"id":"c","type":"system"}]'::json as column1
) t
Есть ли лучший способ сделать это (я уверен, что есть), пожалуйста, помогите, спасибо.
Редактировать:
В будущем могут быть добавлены другие свойства в дополнение к «id» и «type», код должен будет ссылаться только на «id». [{"id":"b","type":"user"},{"id":"c","type":"system"}, {"id":"d","type":"system", "flag":"Y"}]
Комментарии:
1.
jsonb
это несколько улучшило бы его, но правильным решением было бы избежать JSON в базе данных и нормализовать модель данных.2. спасибо за ответ @LaurenzAlbe, исходными данными является сгенерированное системой сообщение JSON в вышеуказанном формате, мне нужно только «идентифицировать» компонент и передать его в отдельную систему через API Post. Если бы я мог применить только несколько функций для получения результата, то это было бы идеально.
Ответ №1:
Я должен посоветовать следующий поток:
select array_agg(row_to_json(t.*)) from (
select id
from jsonb_to_recordset('[{"id":"b","type":"user"},{"id":"c","type":"system"}]'::jsonb) as x(id varchar, type varchar)
) t;
Вы можете воспроизвести SQL здесь
Комментарии:
1. Спасибо @Slava, интересно, есть ли способ избежать использования ключа «type», поскольку в будущем к объекту могут быть добавлены дополнительные свойства или пары ключ-значение.
Ответ №2:
Я нашел ответ, который не ссылается на другие свойства в объектах JSON.
select json_agg(json_build_object('id', id)) as id
from (
select json_array_elements('[{"id":"b","type":"user"},{"id":"c","type":"system"}, {"id":"d","type":"system", "flag":"Y"}]'::json)::json->'id' as id
) t