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