Si vous pouvez mettre à niveau vers Postgresql 9.5, le jsonb_set
la commande est disponible, comme d'autres l'ont mentionné.
Dans chacune des instructions SQL suivantes, j'ai omis le where
clause de brièveté ; évidemment, vous voudriez rajouter cela.
Mettre à jour le nom :
UPDATE test SET data = jsonb_set(data, '{name}', '"my-other-name"');
Remplacez les balises (au lieu d'ajouter ou de supprimer des 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);
Supprimer la dernière balise :
UPDATE test SET data = data #- '{tags,-1}'
Mise à jour complexe (supprimer la dernière balise, insérer une nouvelle balise et changer 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 à 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 réattribuez cette version modifiée à la colonne. En pratique, le résultat devrait être le même, mais garder cela à l'esprit devrait rendre les mises à jour complexes, comme le dernier exemple, plus compréhensibles.
Dans l'exemple complexe, il y a trois transformations et trois versions temporaires :Tout d'abord, 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 changeant le name
domaine. La valeur dans les data
colonne est remplacée par la version finale.