Postgresql 在postgres中使用连接运算符更新jsonb字段
我正在尝试使用postgres中的concatenation操作符更新一个jsonb字段,该字段中有嵌套的json对象,如中所示 但是,如果我运行下面的脚本,它会删除所有其他字段Postgresql 在postgres中使用连接运算符更新jsonb字段,postgresql,jsonb,Postgresql,Jsonb,我正在尝试使用postgres中的concatenation操作符更新一个jsonb字段,该字段中有嵌套的json对象,如中所示 但是,如果我运行下面的脚本,它会删除所有其他字段 更新t SET details=details | |{“name”:{“firstname”:“newname”},“address”:{“city”:“newCity”} 其中详细信息->'name'>>'firstname'='myname' 它从更新的字段中删除“lastname”字段 我也尝试过使用json
更新t
SET details=details | |{“name”:{“firstname”:“newname”},“address”:{“city”:“newCity”}
其中详细信息->'name'>>'firstname'='myname'
它从更新的字段中删除“lastname”
字段
我也尝试过使用
jsonb_集
进行更新,但我不确定如何使用jsonb_集
更新多个属性,|
方法不起作用,因为新的名称值是{“firstname”:“newname”}
。这将替换完整的旧值{“firstname”:“myname”、“lastname”:“last”}
,从而删除lastname
属性。只有在处理顶级字段时,这种方法才有效。但您希望更新嵌套对象
在这种情况下,我看不出有什么办法可以绕过对jsonb_set()
的两个单独调用。一种可能的方法是将它们嵌套:
详细信息
字段;通过给定路径设置新的firstname
值'{name,firstname}'
city
值的后续更新你能解释一下你想要达到的目标吗?据我所知:旧JSON{“a”:“b}扩展为{“a”:“c}。但如果你有两倍于同一把钥匙的话……你的DBFIDLE似乎正好显示了你想要的东西。你是说当你在一个真实的数据库上做这件事时,行为是不同的吗?@JSpratt问题中的查询删除了@S-Man中的“lastname”属性,我正试图在同一个查询中更新name对象中的firstname属性和address对象中的city属性我还在想办法,如果我必须用上面的查询更新5个甚至更多的嵌套对象。你有什么心事吗?也许你可以发布一些你真实的数据?如果我必须在一个查询中更新
名、姓、家庭地址和工作地址,我可以看看会发生什么。这里是地址是json对象的地方。要替换整个值还是仅替换城市元素?在这种特殊情况下,可以聚合name对象,因为没有其他子元素。因此,可以一次性替换整个名称对象。由于两个城市有不同的路径,您将需要两个不同的呼叫。
UPDATE t
SET details =
jsonb_set(
jsonb_set(details, '{name,firstname}','"newname"'),
'{address,city}',
'"newCity"'
)
WHERE details -> 'name' ->> 'firstname' = 'myname';