Saltar al contenido

Actualizar ciertos array elementos de un json array en PostgreSQL 9.4

Luego de mucho luchar hemos dado con el resultado de este atolladero que muchos usuarios de nuestro espacio tienen. Si tienes algo más que aportar no dejes de compartir tu conocimiento.

Solución:

No puede manipular los elementos seleccionados de un json / jsonb escriba directamente. Todavía falta la funcionalidad para eso en Postgres 9.4 (ver el comentario de @Craig). Tienes que hacer 3 pasos:

  1. Anular/descomponer el valor JSON.
  2. Manipular elementos seleccionados.
  3. Agregue/componga el valor nuevamente.

Para reemplazar el 3er elemento del json array (data->3) en la fila con id = 1 con un valor dado (nuevo) ('') en pág. 9.4:

UPDATE test t
SET    data = t2.data
FROM  (
   SELECT id, array_to_json(
                 array_agg(CASE WHEN rn = 1 THEN '' ELSE elem END))
              ) AS data
   FROM   test t2
        , json_array_elements_text(t2.data) WITH ORDINALITY x(elem, rn)         
   WHERE  id = 1
   GROUP  BY 1
   ) t2
WHERE  t.id = t2.id
AND    t.data <> t2.data; -- avoid empty updates

Sobre json_array_elements_text():

  • Cómo convertir json array en postgres array?

Sobre WITH ORDINALITY:

  • PostgreSQL unnest () con número de elemento

Puede hacer esto desde PostgreSQL 9.5 con jsonb_set:

INSERT INTO test(data) VALUES('[1,2,"a",4,"8",6]');
UPDATE test SET data = jsonb_set(data, '2','"b"', false) WHERE id = 1

Pruébalo con una simple selección:

SELECT jsonb_set('[1,2,"a",4,"8",6]', '2','"b"', false)
-- [1, 2, "b", 4, "8", 6]

Y si desea actualizar dos campos, puede hacerlo:

SELECT jsonb_set(jsonb_set('[1,2,"a",4,"8",6]', '0','100', false), '2','"b"', false)
-- [100, 2, "b", 4, "8", 6]

Puedes avalar nuestra ocupación dejando un comentario o valorándolo te estamos eternamente agradecidos.

¡Haz clic para puntuar esta entrada!
(Votos: 0 Promedio: 0)



Utiliza Nuestro Buscador

Deja una respuesta

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *