PostgreSQL
 sql >> Base de données >  >> RDS >> PostgreSQL

Comment modifier ou supprimer un objet JSON spécifique du tableau JSON stocké dans le type de colonne jsonb dans PostgreSQL en utilisant la clause where ?

Les deux problèmes nécessitent la désimbrication et l'agrégation des éléments JSON (modifiés). Pour les deux problèmes, je créerais une fonction pour rendre cela plus facile à utiliser.

create function remove_element(p_value jsonb, p_to_remove jsonb)
  returns jsonb
as
$$
  select jsonb_agg(t.element order by t.idx)  
  from jsonb_array_elements(p_value) with ordinality as t(element, idx)
  where not t.element @> p_to_remove;
$$
language sql
immutable;

La fonction peut être utilisée comme ceci, par ex. dans une instruction UPDATE :

update the_table
  set the_column = remove_element(the_column, '{"ModuleId": 1}')
where ...

Pour le deuxième problème, une fonction similaire est utile.

create function change_value(p_value jsonb, p_what jsonb, p_new jsonb)
  returns jsonb
as
$$
  select jsonb_agg(
         case
           when t.element @> p_what then t.element||p_new
           else t.element
         end order by t.idx)  
  from jsonb_array_elements(p_value) with ordinality as t(element, idx);
$$
language sql
immutable;

Le || l'opérateur écrasera une clé existante, ce qui remplacera effectivement l'ancien nom par le nouveau nom.

Vous pouvez l'utiliser comme ceci :

update the_table
  set the_column = change_value(the_column, '{"ModuleId": 1}', '{"ModuleName": "CBA"}')
where ...;

Je pense que le passage des valeurs JSON est un peu plus flexible que le codage en dur des clés, ce qui rend l'utilisation de la fonction très limitée. La première fonction peut également être utilisée pour supprimer des éléments de tableau en comparant plusieurs clés.

Si vous ne voulez pas créer les fonctions, remplacez l'appel de fonction par le select depuis les fonctions.