wake-up-neo.net

Anhängen (Pushen) und Entfernen aus einem JSON-Array in PostgreSQL 9.5+

Für Versionen unter 9.5 siehe diese Frage

Ich habe eine Tabelle in PostgreSQL erstellt:

CREATE TEMP TABLE jsontesting
AS
  SELECT id, jsondata::jsonb FROM ( VALUES
    (1, '["abra","value","mango", "Apple", "sample"]'),
    (2, '["japan","china","india", "russia", "australia"]'),
    (3, '["must", "match"]'),
    (4, '["abra","value","true", "Apple", "sample"]'),
    (5, '["abra","false","mango", "Apple", "sample"]'),
    (6, '["string","value","mango", "Apple", "sample"]'),
    (7, '["must", "watch"]')
  ) AS t(id,jsondata);

Jetzt wollte ich es

  • add So etwas wie append_to_json_array nimmt die tatsächlichen jsondata auf, die ein json-Array sind, und den newString, den ich hinzufügen muss zu diesem jsondata Array und diese Funktion sollte das aktualisierte json-Array zurückgeben.

    UPDATE jsontesting
    SET jsondata=append_to_json_array(jsondata, 'newString')
    WHERE id = 7;
    
  • entferne einen Wert aus dem json-Datenfeld, eine Funktion zum Entfernen des Werts.

Ich habe versucht, die Dokumentation von PostgreSQL zu durchsuchen, aber dort nichts gefunden.

22
Evan Carroll

Verwenden Sie zum Hinzufügen des Werts den JSON-Array-Append-Opperator (||)

UPDATE jsontesting
SET jsondata = jsondata || '["newString"]'::jsonb
WHERE id = 7;

Das Entfernen des Werts sieht folgendermaßen aus

UPDATE jsontesting
SET jsondata = jsondata - "newString"
WHERE id = 7; 

Die Verknüpfung mit einem verschachtelten Feld sieht folgendermaßen aus

UPDATE jsontesting
SET jsondata = jsonb_set(
  jsondata::jsonb,
  array['nestedfield'],
  (jsondata->'nestedfield')::jsonb || '["newString"]'::jsonb) 
WHERE id = 7;
49
Evan Carroll

Um die Antwort von Evan Carroll zu ergänzen, können Sie folgendermaßen vorgehen, um die Spalte auf ein leeres Array zu setzen, wenn es sich um NULL handelt. Der Anhängeoperator (||) macht nichts, wenn die Spalte gerade NULL ist.

UPDATE jsontesting SET jsondata = (
    CASE
        WHEN jsondata IS NULL THEN '[]'::JSONB
        ELSE jsondata
    END
) || '["newString"]'::JSONB WHERE id = 7;
6
winduptoy