Como preceder / inserir um elemento em uma matriz jsonb no PostgreSQL 12?

Sep 08 2020

Exemplo:

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

Já sei como anexar a um array. Por exemplo:

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

Isso retorna:

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

Mas eu não sei como preprended ou inserir um elemento em um array.

Por exemplo:

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

E isso retornaria:

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

Mas não há jsonb_array_insertfunção. A documentação emhttps://www.postgresql.org/docs/12/functions-json.html (Tabela 9.45. Operadores jsonb adicionais) descreve alguns operadores jsonb úteis, mas nenhum deles pode ser usado para inserir / anexar elementos.

Bem, jsonb_array_elements(value->'items')pode ser usado para converter uma matriz em um conjunto de elementos. Mas não vejo como poderia ser usado para inserir / preceder elementos no array.

Eu poderia escrever minha própria função PL / SQL para isso, mas deve haver uma maneira melhor!

Respostas

2 AkhileshMishra Sep 08 2020 at 16:25

Você pode usar JSONB_INSERTpara alcançar o que deseja. Consulte a documentação .

Experimente desta forma:

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

Esta função funciona exatamente de acordo com sua necessidade.