JSONsolo PostgreSQL

JSONB_SET

Devuelve una copia del JSON con un valor nuevo en la ruta indicada.

Sintaxis

JSONB_SET(<json>, '{<ruta>}', <nuevo valor>)
JSONB_SET(<json>, '{<ruta>}', <nuevo valor>, <crear si falta>)

La ruta se escribe como una lista de claves entre llaves: '{name}' es una clave del nivel superior, y '{address,city}', una anidada. El valor nuevo debe ser JSON, así que el texto va entre comillas dobles: '"Liam"'. Si la clave no existe, se añade; un cuarto argumento false lo desactiva.

Sustituir un número
SELECT JSONB_SET('{"name": "Emma", "salary": 1200}', '{salary}', '1300') AS updated;
updated
{"name":"Emma","salary":1300}
El texto va entre comillas dobles
SELECT JSONB_SET('{"name": "Emma"}', '{name}', '"Liam"') AS renamed;
renamed
{"name":"Liam"}
Una clave anidada
SELECT JSONB_SET('{"address": {"city": "London"}}', '{address,city}', '"Berlin"') AS moved;
moved
{"address":{"city":"Berlin"}}

Ten en cuenta

El valor nuevo es JSON, no texto: JSONB_SET(data, '{name}', 'Liam') da el error invalid input syntax for type json. Escribe '"Liam"' y convierte los valores de las columnas con TO_JSONB(name).

Si el valor nuevo es NULL, todo el documento pasa a ser NULL, no una clave con valor null. Para null, pasa 'null'.

No crea claves intermedias: JSONB_SET('{}', '{address,city}', '"Berlin"') devuelve {} sin cambios.

Solo devuelve un JSON nuevo. Para cambiar los datos de una tabla, necesitas UPDATE … SET data = JSONB_SET(data, …).