Si vous pouvez mettre à niveau vers Postgresql 9.5, la jsonb_set
commande est disponible, comme d'autres l'ont mentionné.
Dans chacune des instructions SQL suivantes, j'ai omis la where
clause par souci de concision; évidemment, vous voudriez l'ajouter.
Mettre à jour le nom:
UPDATE test SET data = jsonb_set(data, '{name}', '"my-other-name"');
Remplacez les balises (par opposition à l'ajout ou à la suppression de balises):
UPDATE test SET data = jsonb_set(data, '{tags}', '["tag3", "tag4"]');
Remplacement de la deuxième balise (indexée 0):
UPDATE test SET data = jsonb_set(data, '{tags,1}', '"tag5"');
Ajouter une balise ( cela fonctionnera tant qu'il y aura moins de 999 balises; changer l'argument 999 en 1000 ou plus génère une erreur . Cela ne semble plus être le cas dans Postgres 9.5.3; un index beaucoup plus grand peut être utilisé) :
UPDATE test SET data = jsonb_set(data, '{tags,999999999}', '"tag6"', true);
Supprimez la dernière balise:
UPDATE test SET data = data #- '{tags,-1}'
Mise à jour complexe (supprimez la dernière balise, insérez une nouvelle balise et modifiez le nom):
UPDATE test SET data = jsonb_set(
jsonb_set(data #- '{tags,-1}', '{tags,999999999}', '"tag3"', true),
'{name}', '"my-other-name"');
Il est important de noter que dans chacun de ces exemples, vous ne mettez pas réellement à jour un seul champ des données JSON. Au lieu de cela, vous créez une version temporaire et modifiée des données et attribuez cette version modifiée à la colonne. En pratique, le résultat devrait être le même, mais en gardant cela à l'esprit, les mises à jour complexes, comme le dernier exemple, devraient être plus compréhensibles.
Dans l'exemple complexe, il existe trois transformations et trois versions temporaires: Premièrement, la dernière balise est supprimée. Ensuite, cette version est transformée en ajoutant une nouvelle balise. Ensuite, la deuxième version est transformée en modifiant le name
champ. La valeur de la data
colonne est remplacée par la version finale.