es.davy.ai

Preguntas y respuestas de programación confiables

¿Tienes una pregunta?

Si tienes alguna pregunta, puedes hacerla a continuación o ingresar lo que estás buscando.

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
id | dynamic_fields
0 | {"key1": "aaaaa text2", "key2": "text2", "key3": "blabla"}
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?

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.

Tags:  , ,

Answer

  1. Avatar for 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:

    UPDATE contenido
    SET dynamic_fields = jsonb_set(
      dynamic_fields,
      '{key1}',
      to_jsonb(replace(dynamic_fields->>'key1', 'texto1', 'texto2'))
    );
    

    En esta consulta, jsonb_set() se utiliza para actualizar la columna dynamic_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ón replace() (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 a replace().

    Después de ejecutar esta consulta, la columna dynamic_fields debería contener el objeto jsonb actualizado con solo el reemplazo deseado.

Comments are closed.