Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/postgresql/10.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Postgresql 在postgres中使用连接运算符更新jsonb字段_Postgresql_Jsonb - Fatal编程技术网

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

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

我正在尝试使用postgres中的concatenation操作符更新一个jsonb字段,该字段中有嵌套的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}'
  • 生成的JSON对象可以用同样的方法直接用于
    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';