human
Comment modifier les champs à l'intérieur du nouveau type de données JSON de PostgreSQL
gpt
Avec Postgresql 9.5, cela peut être fait en suivant les étapes suivantes :
```UPDATE test
SET data = data - 'a' || '{"a":5}'
WHERE data->>'b' = '2';
```
OU
```UPDATE test
SET data = jsonb_set(data, '{a}', '5'::jsonb);
```

Quelqu'un a demandé comment mettre à jour plusieurs champs dans une valeur jsonb en une seule fois. Supposons que nous créons une table :
```CREATE TABLE testjsonb ( id SERIAL PRIMARY KEY, object JSONB );
```
Ensuite, nous INSÉRONS une ligne expérimentale :
```INSERT INTO testjsonb
VALUES (DEFAULT, '{"a":"one", "b":"two", "c":{"c1":"see1","c2":"see2","c3":"see3"}}');
```
Ensuite, nous METTONS À JOUR la ligne :
```UPDATE testjsonb SET object = object - 'b' || '{"a":1,"d":4}';
```
Ce qui fait ce qui suit :

* Met à jour le champ a
* Supprime le champ b
* Ajoute le champ d

La sélection des données :
```SELECT jsonb_pretty(object) FROM testjsonb;
```
Résultera en :
```      jsonb_pretty
-------------------------
 {                      +
     "a": 1,            +
     "c": {             +
         "c1": "see1",  +
         "c2": "see2",  +
         "c3": "see3",  +
     },                 +
     "d": 4             +
 }
(1 ligne)
```
Pour mettre à jour un champ à l'intérieur, n'utilisez pas l'opérateur de concaténation ```||```. Utilisez plutôt jsonb_set. Ce qui n'est pas simple :
```UPDATE testjsonb SET object =
jsonb_set(jsonb_set(object, '{c,c1}','"seeme"'),'{c,c2}','"seehim"');
```
En utilisant l'opérateur de concaténation pour {c,c1} par exemple :
```UPDATE testjsonb SET object = object || '{"c":{"c1":"seedoctor"}}';
```
Supprimera {c,c2} et {c,c3}.
Pour plus de puissance, consultez la documentation des fonctions json de postgresql. On peut être intéressé par l'opérateur ```#-```, la fonction ```jsonb_set``` et aussi la fonction ```jsonb_insert```.