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:
- Anular/descomponer el valor JSON.
- Manipular elementos seleccionados.
- 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.