2023 Aug Update:
Zusätzlich zu den unten stehenden Informationen finden Sie in Kouber Saparevs Antwort für PostgreSQL 14.
Mit PostgreSQL 9.5 kann dies wie folgt gemacht werden:
UPDATE test
SET data = data - 'a' || '{"a":5}'
WHERE data->>'b' = '2';
ODER
UPDATE test
SET data = jsonb_set(data, '{a}', '5'::jsonb);
Jemand hat gefragt, wie viele Felder gleichzeitig in einem JSONB-Wert aktualisiert werden können. Nehmen wir an, wir erstellen eine Tabelle:
CREATE TABLE testjsonb ( id SERIAL PRIMARY KEY, object JSONB );
Dann fügen wir eine experimentelle Zeile ein:
INSERT INTO testjsonb
VALUES (DEFAULT, '{"a":"eins", "b":"zwei", "c":{"c1":"siehe1","c2":"siehe2","c3":"siehe3"}}');
Dann aktualisieren wir die Zeile:
UPDATE testjsonb SET object = object - 'b' || '{"a":1,"d":4}';
Das führt zu folgendem Ergebnis:
- Aktualisiert das Feld a
- Entfernt das Feld b
- Fügt das Feld d hinzu
Auswahl der Daten:
SELECT jsonb_pretty(object) FROM testjsonb;
Ergebnis:
jsonb_pretty
-------------------------
{ +
"a": 1, +
"c": { +
"c1": "siehe1", +
"c2": "siehe2", +
"c3": "siehe3", +
}, +
"d": 4 +
}
(1 row)
Um ein Feld im Inneren zu aktualisieren, verwenden Sie nicht den Konkatenationsoperator ||
. Verwenden Sie stattdessen jsonb_set. Das ist nicht einfach:
UPDATE testjsonb SET object =
jsonb_set(jsonb_set(object, '{c,c1}','"sehenmich"'),'{c,c2}','"siegelui"');
Die Verwendung des Konkatenationsoperators für {c,c1} würde z.B. so aussehen:
UPDATE testjsonb SET object = object || '{"c":{"c1":"seedoctor"}}';
Das würde {c,c2} und {c,c3} entfernen.
Für mehr Möglichkeiten, suchen Sie in der PostgreSQL JSON Funktionen Dokumentation nach mehr Leistung. Man könnte am #-
Operator, der jsonb_set
Funktion und auch der jsonb_insert
Funktion interessiert sein.