Как добавить / вставить элемент в массив jsonb в PostgreSQL 12?

#arrays #postgresql #jsonb

#массивы #postgresql #jsonb

Вопрос:

Пример:

 drop table a;
create table a( value jsonb);
insert into a values ('{"items":[0,1,2]}'::jsonb);
select value->'items' from a;
  

Я уже знаю, как добавить к массиву. Например:

 select jsonb_build_object('items', 
        value->'items' || '3'::jsonb
)  from a
  

Это возвращает:

 {"items": [0, 1, 2, 3]}
  

Но я не знаю, как подготовить или вставить элемент в массив.

Например:

 select jsonb_build_object('items', 
        jsonb_array_insert(value->'items',0,-1)
)  from a
  

И это вернет:

 {"items": [-1, 0, 1, 2]}
  

Но нет jsonb_array_insert функции. Документация на https://www.postgresql.org/docs/12/functions-json.html (Таблица 9.45. Дополнительные операторы jsonb ) описывает некоторые полезные операторы jsonb, но ни один из них не может быть использован для вставки / добавления элементов.

Ну, jsonb_array_elements(value->'items') может использоваться для преобразования массива в набор элементов. Но я не понимаю, как это можно использовать для вставки / добавления элементов в массив.

Возможно, я мог бы написать для этого свою собственную функцию PL / SQL, но должен быть лучший способ!

Ответ №1:

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

Попробуйте это так:

 select 
jsonb_insert(value,'{items,0}','-1'::jsonb)
from a
  

Эта функция работает точно в соответствии с вашими требованиями.