在 postgres 中使用连接运算符更新 jsonb 字段

Updating jsonb field using concatenation operator in postgres

我正在尝试更新 jsonb 字段,其中嵌套了 json 个对象,使用 postgres 中的连接运算符,如 dbfidde

但是,它会删除所有其他字段,例如,如果我 运行 下面的脚本

UPDATE t 
SET details = details || '{"name": {"firstname": "newname"},"address":{"city":"newCity"}}'
WHERE details -> 'name' ->>'firstname'='myname'

它从更新的字段中删除了 "lastname" 字段

我也尝试使用 jsonb_set 进行更新,但我不确定如何使用 jsonb_set

更新多个属性

|| 方法不起作用,因为新名称值为 {"firstname":"newname"}。这将替换完整的旧值 {"firstname": "myname","lastname":"last"} 并因此删除 lastname 属性。这种方式仅在您处理顶级字段时才有效。但是您想更新嵌套对象。

在那种情况下,我看不出有什么办法绕过 jsonb_set() 的两个单独调用。一种可能的方法是嵌套它们:

demo:db<>fiddle

UPDATE t
SET details = 
        jsonb_set(
            jsonb_set(details, '{name,firstname}','"newname"'), 
            '{address,city}', 
            '"newCity"'
        )
WHERE details -> 'name' ->> 'firstname' = 'myname';
  1. 更新原来的details字段;通过给定路径 '{name,firstname}'
  2. 设置新的 firstname
  3. 生成的 JSON 对象可以直接用于使用相同方式对 city 值进行后续更新。