web-dev-qa-db-fra.com

Ajouter (pousser) et supprimer d'un tableau JSON dans PostgreSQL 9.5+

Pour les versions inférieures à 9.5 voir cette question

J'ai créé une table dans PostgreSQL en utilisant ceci:

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);

Maintenant, ce que je voulais c'était

  • add Quelque chose comme append_to_json_array prend la jsondata réelle qui est un tableau json et la newString que je dois ajouter à ce tableau jsondata et cette fonction doit renvoyer le tableau json mis à jour.

    UPDATE jsontesting
    SET jsondata=append_to_json_array(jsondata, 'newString')
    WHERE id = 7;
    
  • supprimer une valeur du tableau de données json, une fonction pour supprimer la valeur.

J'ai essayé de rechercher la documentation de PostgreSQL mais n'y ai rien trouvé.

22
Evan Carroll

Pour ajouter la valeur, utilisez l’opérateur d’ajout de tableau JSON (||)

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

La suppression de la valeur ressemble à ceci

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

La concaténation d'un champ imbriqué ressemble à ceci

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

Pour ajouter à la réponse d'Evan Carroll, vous souhaiterez peut-être procéder comme suit pour définir la colonne sur un tableau vide s'il s'agit de NULL. L'opérateur d'ajout (||) ne fait rien si la colonne est actuellement NULL.

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