Wie kann man ein Element in ein jsonb-Array in PostgreSQL 12 voranstellen / einfügen?

Sep 08 2020

Beispiel:

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

Ich weiß bereits, wie man ein Array anfügt. Zum Beispiel:

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

Dies gibt zurück:

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

Aber ich weiß nicht, wie man ein Element vorstellt oder in ein Array einfügt .

Zum Beispiel:

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

Und das würde zurückkehren:

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

Es gibt aber keine jsonb_array_insertFunktion. Die Dokumentation unterhttps://www.postgresql.org/docs/12/functions-json.html (Tabelle 9.45. Zusätzliche jsonb-Operatoren) beschreibt einige nützliche jsonb-Operatoren, von denen jedoch keiner zum Einfügen / Voranstellen von Elementen verwendet werden kann.

Nun, jsonb_array_elements(value->'items')kann verwendet werden , um eine Anordnung in einen Satz von Elementen zu konvertieren. Aber ich sehe nicht, wie es verwendet werden könnte, um Elemente in das Array einzufügen / voranzustellen.

Ich könnte möglicherweise meine eigene PL / SQL-Funktion dafür schreiben, aber es muss einen besseren Weg geben!

Antworten

2 AkhileshMishra Sep 08 2020 at 16:25

Sie können verwenden JSONB_INSERT, um zu erreichen, was Sie wollen. Bitte beachten Sie die Dokumentation .

Versuchen Sie es so:

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

Diese Funktion funktioniert genau nach Ihren Anforderungen.