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
Sql 如何更新嵌套json Postgres中的值_Sql_Postgresql_Jsonb - Fatal编程技术网

Sql 如何更新嵌套json Postgres中的值

Sql 如何更新嵌套json Postgres中的值,sql,postgresql,jsonb,Sql,Postgresql,Jsonb,我在“Info”列中存储了以下JSON { “自定义配置”:{ “isCustomGoods”:1 }, “新添加字段”:{ “数据”:[ { “val”:{ “项目”:[ { “代码”:“卡路里”, “值”:“365.76” }, { “代码”:“蛋白质”, “值”:“29.02” }, { “代码”:“fat”, “值”:“23.55” }, { “代码”:“碳水化合物”, “值”:“6.02” }, { “准则”:“精神”, “值”:“1.95” } ], “存储条件”:“, “超出数量”

我在“Info”列中存储了以下JSON

{
“自定义配置”:{
“isCustomGoods”:1
},
“新添加字段”:{
“数据”:[
{
“val”:{
“项目”:[
{
“代码”:“卡路里”,
“值”:“365.76”
},
{
“代码”:“蛋白质”,
“值”:“29.02”
},
{
“代码”:“fat”,
“值”:“23.55”
},
{
“代码”:“碳水化合物”,
“值”:“6.02”
},
{
“准则”:“精神”,
“值”:“1.95”
}
],
“存储条件”:“,
“超出数量”:“100”
},
“参数类型”:“营养”,
“名称”:“00000000-0000-0000-0000-000000000001”,
“标签”:“1”
},
{
“名称”:“b4589168-5235-4ec5-bcc7-07d4431d14d6_589168-5235-4ec5-bcc7-07d4431d14d6_58916;ааааааа1072,
“val”:“true”
}
]
}
}
我想更新嵌套json的值

{
“名称”:“b4589168-5235-4ec5-bcc7-07d4431d14d6_589168-5235-4ec5-bcc7-07d4431d14d6_58916;ааааааа1072,
“val”:“true”
}
并将“val”设置为“Yes”str,结果如下

{
“名称”:“b4589168-5235-4ec5-bcc7-07d4431d14d6_589168-5235-4ec5-bcc7-07d4431d14d6_58916;ааааааа1072,
“val”:“是”
}
我该怎么做?假设我需要在json中为数据库中的许多记录更新这个值,我们可以使用Postgres 9.5中提供的
jsonb_set()
+

发件人:

jsonb_集(目标jsonb,路径文本[],新值jsonb[,创建缺少的布尔值])
用于更新嵌套对象的查询:

更新温度t
SET info=jsonb_SET(t.info,{new_addfields,data,1,val}',jsonb'Yes')
其中id=1;
也可用于选择查询:

选择
jsonb_集(t.info,'{new_addfields,data,1,val}',jsonb'Yes')
从温度t
限值1;
我们可以使用Postgres 9.5提供的
jsonb_set()
+

发件人:

jsonb_集(目标jsonb,路径文本[],新值jsonb[,创建缺少的布尔值])
用于更新嵌套对象的查询:

更新温度t
SET info=jsonb_SET(t.info,{new_addfields,data,1,val}',jsonb'Yes')
其中id=1;
也可用于选择查询:

选择
jsonb_集(t.info,'{new_addfields,data,1,val}',jsonb'Yes')
从温度t
限值1;

考虑到您的表中有一个恒定的JSON结构和一个主键。想法是获取元素
val
的确切路径,该元素具有值
true
(可以位于数组中的任何索引处),然后用所需值替换它。因此,您可以按如下方式编写查询:

使用cte作为(
挑选
身份证件
(“{new_addfields,data,”| | index-1 | |,val}”)::text[]作为json_路径
从…起
测试,
jsonb_数组_元素(信息->新添加字段->数据)
带序数arr(VAL,索引)
哪里
arr.vals->“val”我喜欢“true”
)
更新测试
set info=jsonb_set(info,cte.json_路径,'Yes',false)
来自cte
其中test.id=cte.id;

考虑到您的表中有一个恒定的JSON结构和一个主键。想法是获得元素
val
的确切路径,该元素的值
true
(可以位于数组中的任何索引处),然后用所需的值替换它。因此,您可以按如下方式编写查询:

使用cte作为(
挑选
身份证件
(“{new_addfields,data,”| | index-1 | |,val}”)::text[]作为json_路径
从…起
测试,
jsonb_数组_元素(信息->新添加字段->数据)
带序数arr(VAL,索引)
哪里
arr.vals->“val”我喜欢“true”
)
更新测试
set info=jsonb_set(info,cte.json_路径,'Yes',false)
来自cte
其中test.id=cte.id;

您的JSON结构是固定的还是可以更改您的JSON结构是固定的还是可以更改的