Come anteporre / inserire un elemento in un array jsonb in PostgreSQL 12?

Sep 08 2020

Esempio:

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

So già come aggiungere a un array. Per esempio:

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

Questo restituisce:

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

Ma non so come predisporre o inserire un elemento in un array.

Per esempio:

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

E questo tornerebbe:

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

Ma non c'è nessuna jsonb_array_insertfunzione. La documentazione suhttps://www.postgresql.org/docs/12/functions-json.html (Tabella 9.45. Operatori jsonb aggiuntivi) descrive alcuni utili operatori jsonb, ma nessuno di essi può essere utilizzato per inserire / anteporre elementi.

Bene, jsonb_array_elements(value->'items')può essere utilizzato per convertire un array in un insieme di elementi. Ma non vedo come potrebbe essere usato per inserire / anteporre elementi nell'array.

Potrei scrivere la mia funzione PL / SQL per questo, ma deve esserci un modo migliore!

Risposte

2 AkhileshMishra Sep 08 2020 at 16:25

Puoi utilizzare JSONB_INSERTper ottenere ciò che desideri. Fare riferimento alla documentazione .

Provalo in questo modo:

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

Questa funzione funziona esattamente secondo le tue esigenze.