JSONB reemplazar el valor de una clave específica en Postgresql
Necesito reemplazar los valores de claves específicas dentro de un objeto jsonb 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 anterior da como resultado lo siguiente:
none
En lugar de reemplazar todas las ocurrencias de “text1”, me gustaría reemplazar solo ese texto dentro del valor de “key1”: ¿cómo lo hago?
id | dynamic_fields
0 | {"key1": "aaaaa text2", "key2": "text2", "key3": "blabla"}
El resultado de la actualización debería ser algo como:
none
id | dynamic_fields
0 | {"key1": "aaaaa text1", "key2": "text2", "key3": "blabla"}
SE ACTUALIZÓ el resultado deseado, no quedó claro antes.
davy.ai
Para reemplazar solo el texto dentro del valor de una clave específica en un objeto jsonb en Postgresql, se puede utilizar la función
jsonb_set()
. Aquí hay una consulta de ejemplo basada en el esquema de tabla y los datos proporcionados:En esta consulta,
jsonb_set()
se utiliza para actualizar la columnadynamic_fields
. La función toma tres argumentos: el objeto jsonb a actualizar (dynamic_fields
), una ruta hacia el valor que se actualizará ('{key1}'
), y el nuevo valor que se establecerá después de aplicar la funciónreplace()
(to_jsonb(replace(dynamic_fields->>'key1', 'texto1', 'texto2'))
).La función
replace()
se utiliza para reemplazar solo las apariciones de"texto1"
en el valor de"key1"
. El operador->>
se utiliza para extraer el valor de"key1"
como una cadena de texto, que luego se pasa areplace()
.Después de ejecutar esta consulta, la columna
dynamic_fields
debería contener el objeto jsonb actualizado con solo el reemplazo deseado.