#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
Эта функция работает точно в соответствии с вашими требованиями.