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

Sep 08 2020

Пример:

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, но должен быть способ получше!

Ответы

2 AkhileshMishra Sep 08 2020 at 16:25

Вы можете использовать JSONB_INSERTдля достижения того, чего хотите. См. Документацию .

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

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

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