Si puede actualizar a Postgresql 9.5, el jsonb_set
comando está disponible, como han mencionado otros.
En cada una de las siguientes declaraciones SQL, he omitido la where
cláusula de brevedad; obviamente, querrás volver a agregar eso.
Nombre de actualización:
UPDATE test SET data = jsonb_set(data, '{name}', '"my-other-name"');
Reemplace las etiquetas (en lugar de agregar o quitar etiquetas):
UPDATE test SET data = jsonb_set(data, '{tags}', '["tag3", "tag4"]');
Sustitución de la segunda etiqueta (indexada a 0):
UPDATE test SET data = jsonb_set(data, '{tags,1}', '"tag5"');
Agregue una etiqueta ( esto funcionará siempre que haya menos de 999 etiquetas; cambiar el argumento 999 a 1000 o superior genera un error . Este ya no parece ser el caso en Postgres 9.5.3; se puede usar un índice mucho mayor) :
UPDATE test SET data = jsonb_set(data, '{tags,999999999}', '"tag6"', true);
Eliminar la última etiqueta:
UPDATE test SET data = data #- '{tags,-1}'
Actualización compleja (elimine la última etiqueta, inserte una nueva etiqueta y cambie el nombre):
UPDATE test SET data = jsonb_set(
jsonb_set(data #- '{tags,-1}', '{tags,999999999}', '"tag3"', true),
'{name}', '"my-other-name"');
Es importante tener en cuenta que en cada uno de estos ejemplos, en realidad no está actualizando un solo campo de los datos JSON. En cambio, está creando una versión temporal y modificada de los datos, y está asignando esa versión modificada a la columna. En la práctica, el resultado debería ser el mismo, pero teniendo esto en cuenta debería hacer actualizaciones complejas, como el último ejemplo, más comprensibles.
En el ejemplo complejo, hay tres transformaciones y tres versiones temporales: Primero, se elimina la última etiqueta. Luego, esa versión se transforma al agregar una nueva etiqueta. A continuación, la segunda versión se transforma cambiando el name
campo. El valor en la data
columna se reemplaza con la versión final.