371 Stimmen

Wie ändere ich Felder innerhalb des neuen PostgreSQL-JSON-Datentyps?

Mit postgresql 9.3 kann ich bestimmte Felder eines JSON-Datentyps mit SELECT auswählen, aber wie kann ich sie mit UPDATE ändern? Ich finde keine Beispiele dafür in der postgresql-Dokumentation oder online. Ich habe das Offensichtliche versucht:

postgres=# create table test (data json);
CREATE TABLE
postgres=# insert into test (data) values ('{"a":1,"b":2}');
INSERT 0 1
postgres=# select data->'a' from test where data->>'b' = '2';
 ?column?
----------
 1
(1 row)
postgres=# update test set data->'a' = to_json(5) where data->>'b' = '2';
ERROR:  syntax error at or near "->"
LINE 1: update test set data->'a' = to_json(5) where data->>'b' = '2...

180voto

Teo Choong Ping Punkte 11932

Mit 9.5 verwenden Sie jsonb_set-

UPDATE objects
SET body = jsonb_set(body, '{name}', '"Mary"', true)
WHERE id = 1; 

wobei body ein Spaltentyp jsonb ist.

101voto

Fandi Susanto Punkte 2041
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:

  1. Aktualisiert das Feld a
  2. Entfernt das Feld b
  3. 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.

20voto

Neethu Punkte 284

Wenn Ihr Feldtyp JSON ist, funktioniert Folgendes für Sie.

UPDATE 
table_name
SET field_name = field_name::jsonb - 'key' || '{"key":new_val}' 
WHERE field_name->>'key' = 'old_value'.

Der Operator '-' löscht das Schlüssel/Wert-Paar oder das String-Element vom linken Operanden. Schlüssel/Wert-Paare werden anhand ihres Schlüsselwerts abgeglichen.

Der Operator '||' verbindet zwei JSONB-Werte zu einem neuen JSONB-Wert.

Da es sich um JSONB-Operatoren handelt, müssen Sie einfach zu::jsonb umwandeln

Weitere Informationen : JSON-Funktionen und -Operatoren

Sie können meine Notiz hier lesen

16voto

Kouber Saparev Punkte 6707

Ab PostgreSQL 14 können Sie jsonb-Subskripte verwenden, um direkt auf die Elemente des JSON-Feldes zuzugreifen und sie gegebenenfalls zu aktualisieren.

UPDATE test SET data['a'] = '5' WHERE data['b'] = '2';

14voto

sigod Punkte 2333
UPDATE test
SET data = data::jsonb - 'a' || '{"a":5}'::jsonb
WHERE data->>'b' = '2'

Dies scheint auf PostgreSQL 9.5 zu funktionieren

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X