JSONB reemplazar el valor de una clave específica Postgresql

0

Pregunta

Necesito reemplazar los valores de teclas específicas dentro de un jsonb objeto en 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;

Este código hasta aquí nos da el siguiente resultado:

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

En lugar de reemplazar todas las apariciones de "texto1", me gustaría reemplazar sólo que el texto dentro de el valor de "clave1": ¿cómo lo hago?

El resultado de la actualización debería ser algo como:

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

ACTUALIZADO el resultado deseado, no fue lo suficientemente clara.

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

Mejor respuesta

1

Uso de la función jsonb_build_object().

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

Prueba en la Db<>violín.

2021-11-22 14:25:16

Eso es todo, gracias!
Stefano De Rosso
0

Usted puede utilizar el operador || contactar con dos datos JSON y generar nuevos datos JSON. Ahora podemos utilizar || para unirse a la vieja de datos JSON a los nuevos datos en JSON (Como por ejemplo: {"key2": "text2"})

Demo

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

P. S:

También, usted puede utilizar jsonb_set función para cambiar los datos.

Demo

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

Quiero que el texto existente para permanecer intactas, de modo que esto sólo funciona si el valor es "texto1" y quiero cambiarlo a "text2", pero si tengo "aaaaaa texto1" y quiero cambiar a "aaaaaa text2" no funciona. Necesito reemplazar una parte de la cadena, no para actualizar el conjunto de la cadena.
Stefano De Rosso

En otros idiomas

Esta página está en otros idiomas

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