在 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()
的两个单独调用。一种可能的方法是嵌套它们:
UPDATE t
SET details =
jsonb_set(
jsonb_set(details, '{name,firstname}','"newname"'),
'{address,city}',
'"newCity"'
)
WHERE details -> 'name' ->> 'firstname' = 'myname';
- 更新原来的
details
字段;通过给定路径 '{name,firstname}'
设置新的 firstname
值
- 生成的 JSON 对象可以直接用于使用相同方式对
city
值进行后续更新。
我正在尝试更新 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()
的两个单独调用。一种可能的方法是嵌套它们:
UPDATE t
SET details =
jsonb_set(
jsonb_set(details, '{name,firstname}','"newname"'),
'{address,city}',
'"newCity"'
)
WHERE details -> 'name' ->> 'firstname' = 'myname';
- 更新原来的
details
字段;通过给定路径'{name,firstname}'
设置新的 - 生成的 JSON 对象可以直接用于使用相同方式对
city
值进行后续更新。
firstname
值