PostgreSQL: создать сообщение JSON с определенными объектами, выбранными в массиве

#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