【发布时间】:2019-08-22 06:57:33
【问题描述】:
我有以下不便,我想仅使用 PostgreSQL 更新 JSON 数组的键。我有以下 json:
[
{
"ch":"1",
"id":"12",
"area":"0",
"level":"Superficial",
"width":"",
"length":"",
"othern":"5",
"percent":"100",
"location":" 2nd finger base"
},
{
"ch":"1",
"id":"13",
"area":"0",
"level":"Skin",
"width":"",
"length":"",
"othern":"1",
"percent":"100",
"location":" Abdomen "
}
]
如果 "othern" = X
,我需要将 "othern" 更新为另一个数字(X 是我传递给查询的任何数字。例如,如果 othern = 5,则更新 othern)。
这个 JSON 可以更大,所以我需要可以在 JSON 数组中迭代并找到所有匹配 X 数字的 "othern" 并替换为新的一个。谢谢!
我已经尝试过使用 Postgresql 的这些函数 json,但我没有给出正确的结果:
SELECT * FROM jsonb_to_recordset('[{"ch":"1", "id":"12", "area":"0", "level":"Superficial", "width":"", "length":"", "othern":"5", "percent":"100", "location":" 2nd finger base"}, {"ch":"1", "id":"13", "area":"0", "level":"Skin", "width":"", "length":"", "othern":"1", "percent":"100", "location":" Abdomen "}]'::jsonb)
AS t (othern text);
我在 SQL 中发现这个函数与我需要的类似,但老实说 SQL 不是我的强项:
CREATE OR REPLACE FUNCTION "json_array_update_index"(
"json" json,
"index_to_update" INTEGER,
"value_to_update" anyelement
)
RETURNS json
LANGUAGE sql
IMMUTABLE
STRICT
AS $function$
SELECT concat('[', string_agg("element"::text, ','), ']')::json
FROM (SELECT CASE row_number() OVER () - 1
WHEN "index_to_update" THEN to_json("value_to_update")
ELSE "element"
END "element"
FROM json_array_elements("json") AS "element") AS "elements"
$function$;
UPDATE plan_base
SET atts = json_array_update_index([{"ch":"1", "id":"12", "area":"0", "level":"Superficial", "width":"", "length":"", "othern":"5", "percent":"100", "location":" 2nd finger base"}, {"ch":"1", "id":"13", "area":"0", "level":"Skin", "width":"", "length":"", "othern":"1", "percent":"100", "location":" Abdomen "}], '{"othern"}', '{"othern":"71"}'::json)
WHERE id = 2;
【问题讨论】:
-
好的,你传入一个数字。如果数字是 5,应该更新哪些元素?你的意思是:我能不能大点。这是什么意思?数组中的元素更多还是嵌套更深的元素?
-
@S-Man 如果我将它作为数字 5 传递,则所有字段(“othern”:“5”)必须更新为我也必须传递给查询的新数字。
-
@S-Man 更多类似这样的元素:[{ "ch":"1", "id":"13", "area":"0", "level":"Skin ", "width":"", "length":"", "othern":"1", "percent":"100", "location":"腹部" }, { "ch":"1", "id":"13", "area":"0", "level":"Skin", "width":"", "length":"", "othern":"1", "percent": “100”、“位置”:“腹部”}等]
-
我仍然不清楚:您想找到所有包含 othern = 5 的元素。到目前为止,一切都很好。然后怎样呢?哪些元素应该更新为什么?也许您可以将复杂的示例更改为更简单的示例,每个元素只有两个字段并显示预期的输出
-
@S-Man 我想找到所有 "othern" = 5,并将它们自己更新为例如 "othern" = 7 , 仅使用 postgresql。
标签: arrays json postgresql updates