JSONB de remplacer la valeur d'une clé spécifique à Postgresql

0

La question

J'ai besoin de remplacer les valeurs de touches spécifiques à l'intérieur d'un jsonb objet dans Postgresql:

create table content (
  id int,
  dynamic_fields jsonb
  );
  
insert into content values (0, '{
    "key1": "aaaaa text1",
    "key2": "text1",
    "key3": "blabla"}'::jsonb);

UPDATE content 
SET dynamic_fields = replace(dynamic_fields::text, 'text1', 'text2')::jsonb;

Ce code jusqu'ici, donne le résultat suivant:

id |    dynamic_fields  
0  |  {"key1": "aaaaa text2", "key2": "text2", "key3": "blabla"}

Au lieu de remplacer toutes les occurrences de "texte1", je voudrais remplacer seulement que le texte à l'intérieur de la valeur de "key1": comment dois-je faire?

Le résultat de la mise à jour doit être quelque chose comme:

id |    dynamic_fields  
0  |  {"key1": "aaaaa text1", "key2": "text2", "key3": "blabla"}

Mis à JOUR le résultat souhaité, il n'était pas assez claire.

jsonb postgresql replace
2021-11-22 13:55:53
2

La meilleure réponse

1

Utilisation de la fonction jsonb_build_object().

update content
set dynamic_fields = 
    dynamic_fields || 
    jsonb_build_object('key1', replace(dynamic_fields->>'key1', 'text1', 'text2'))
where dynamic_fields ? 'key1'

Tester en Db<>violon.

2021-11-22 14:25:16

C'est ça, merci!
Stefano De Rosso
0

Vous pouvez utiliser l'opérateur || à contact deux données JSON et de générer de nouvelles données JSON. Maintenant, nous pouvons utiliser || pour rejoindre la vieille données JSON à de nouvelles données JSON (Comme: {"key2": "text2"})

Démo

update content
set dynamic_fields = dynamic_fields || '{"key2": "text2"}'::jsonb;

P. S:

Aussi, vous pouvez utiliser jsonb_set fonction pour modifier des données.

Démo

update content
set dynamic_fields = jsonb_set(dynamic_fields, '{key2}', '"text2"');
2021-11-22 14:09:06

Je veux que le texte existant de rester intacts, de sorte que cela fonctionne uniquement si la valeur est "texte1" et je veux le changer pour "texte2", mais si j'ai "aaaaaa texte1" et je veux le changer pour "aaaaaa texte2" ça ne fonctionne pas. J'ai besoin de remplacer une partie de la chaîne, de ne pas mettre à jour l'ensemble de la chaîne.
Stefano De Rosso

Dans d'autres langues

Cette page est dans d'autres langues

Русский
..................................................................................................................
Italiano
..................................................................................................................
Polski
..................................................................................................................
Română
..................................................................................................................
한국어
..................................................................................................................
हिन्दी
..................................................................................................................
Türk
..................................................................................................................
Česk
..................................................................................................................
Português
..................................................................................................................
ไทย
..................................................................................................................
中文
..................................................................................................................
Español
..................................................................................................................
Slovenský
..................................................................................................................