当前位置: 首页 > 知识库问答 >
问题:

如何使用PostgreSQL更新JSON数组

艾国安
2023-03-14

我有以下不便之处,我想只使用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;

共有1个答案

严修德
2023-03-14

您提供的函数更改JSON输入,给出更改后的JSON并更新一个并行表。

对于简单的更新,您不需要函数:

演示:db

UPDATE mytable
SET myjson = s.json_array
FROM (
    SELECT 
        jsonb_agg(
             CASE WHEN elems ->> 'othern' = '5' THEN
                 jsonb_set(elems, '{othern}', '"7"')
             ELSE elems  END
        ) as json_array
    FROM
        mytable,
        jsonb_array_elements(myjson) elems
) s
  1. jsonb\u array\u elements()将数组扩展为每个元素一行

如果您真的需要一个获取参数并返回更改后的JSON的函数,那么这可能是一个解决方案。当然,这不会执行更新。我不太确定您是否想实现这一点:

演示:db

CREATE OR REPLACE FUNCTION json_array_update_index(_myjson jsonb, _val_to_change int, _dest_val int)
RETURNS jsonb
AS $$
DECLARE
    _json_output jsonb;
BEGIN
    SELECT 
        jsonb_agg(
             CASE WHEN elems ->> 'othern' = _val_to_change::text THEN
                 jsonb_set(elems, '{othern}', _dest_val::text::jsonb)
             ELSE elems  END
        ) as json_array
    FROM
        jsonb_array_elements(_myjson) elems
    INTO _json_output;

    RETURN _json_output;
END;
$$ LANGUAGE 'plpgsql';

当然,如果你想像在问题中那样将两者结合起来,你可以这样做:

演示:db

CREATE OR REPLACE FUNCTION json_array_update_index(_myjson jsonb, _val_to_change int, _dest_val int)
RETURNS jsonb
AS $$
DECLARE
    _json_output jsonb;
BEGIN
    UPDATE mytable
    SET myjson = s.json_array
    FROM (
        SELECT 
            jsonb_agg(
                 CASE WHEN elems ->> 'othern' = '5' THEN
                     jsonb_set(elems, '{othern}', '"7"')
                 ELSE elems  END
            ) as json_array
        FROM
            mytable,
            jsonb_array_elements(myjson) elems
    ) s
    RETURNING myjson INTO _json_output;

    RETURN _json_output;
END;
$$ LANGUAGE 'plpgsql';
 类似资料:
  • 我正在使用plugin jQuery datatables并加载我在页面底部DOM中加载的数据,并以以下方式启动插件: 现在,在执行一些操作后,我想使用ajax获得新数据(但不是ajax选项构建在数据中-不要误会我!)并用这些数据更新表。如何使用数据API做到这一点?留档很混乱,我找不到解决办法。任何帮助将非常感谢。谢谢。

  • 问题内容: 我有一个如下的json文件,我想使用更新值 update.json 我想编写一个PowerShell脚本,在其中 如何使用参数? 问题答案: 这是一种方法: 根据@FLGMwt和@mikemaccana,我改进了with,因为默认深度值为2,对于深度大于2的对象,尽管有对象,您仍会收到类信息。

  • 问题内容: 我正在使用Python,并且有一个JSON文件,我想在其中更新与给定键相关的值。也就是说,我包含以下数据 并且我只想将与键相关的值从更改为,以便更新后的文件如下所示: 我该怎么做? 我尝试了以下操作,但没有成功(更改未保存到文件中): 问题答案: 您根本没有保存更改的数据。您必须先加载,然后修改,然后再保存。无法就地修改JSON文件。 您也可以这样做: 如果要确保安全,请首先将新数据写

  • 我用一个名为“Person”的对象创建了一个表,我可以从Postman发布、删除和放置。我对如何从postman中输入的JSON创建新查询没有问题。但是,每当我尝试删除或更新(使用put)我的查询时,我都会使用@PathVariable选择我想要的查询,并使用@RequestVariable更新所选数据。但我希望能够从JSON文件中删除或更新。下面是我的代码的样子。 人与物 个人控制器 这是我的P

  • 我有一个名为employee_Details列的表名称 我使用Java构建JSON数组。具有结构 {[“EMP\u ID”:1,“NAME”:Y,“VECH\u NO”:4587,“SALARY”:1500),“EMP\u ID”:3,“NAME”:Z,“VECH\u NO”:4007,“SALARY”:1800]} 我需要更新表上EMP\U ID存在的完整记录,否则将作为新记录插入。postgr

  • 问题内容: 我遵循“ 是否可以编写数据类型转换器来处理postgresJSON列”中的答案? 实现nodeObject转换器。 然后,我尝试使用可更新的记录来插入一条记录,但出现了 “ org.jooq.exception.SQLDialectNotSupportedException:方言POSTGRES不支持类型为org.postgresql.util.PGobject的类”。 我该如何解决?