Si puede actualizar a Postgresql 9.5, jsonb_set
el comando está disponible, como han mencionado otros.
En cada una de las siguientes sentencias SQL, he omitido el where
cláusula de brevedad; obviamente, querrás volver a agregar eso.
Actualizar nombre:
UPDATE test SET data = jsonb_set(data, '{name}', '"my-other-name"');
Reemplace las etiquetas (a diferencia de agregar o quitar etiquetas):
UPDATE test SET data = jsonb_set(data, '{tags}', '["tag3", "tag4"]');
Reemplazando la segunda etiqueta (0-indexada):
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 más grande):
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 (eliminar la última etiqueta, insertar una nueva etiqueta y cambiar 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 su lugar, está creando una versión modificada temporal de los datos y volviendo a asignar esa versión modificada a la columna. En la práctica, el resultado debería ser el mismo, pero tener esto en cuenta debería hacer que las actualizaciones complejas, como el último ejemplo, sean 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 agregando una nueva etiqueta. A continuación, la segunda versión se transforma cambiando el name
campo. El valor en los data
la columna se reemplaza con la versión final.