如何解析JSON数组以更新postgreSQL中的记录

时间:2016-09-08 10:36:47

标签: java json postgresql

我有一个名为employee_Details的表名,带有列

 EMP_ID   NAME  VECH_NO  SALARY
   1       A      1234    100
   2       B      12345   200

我使用Java构造JSON数组。结构

  

{[ “EMP_ID”:1, “NAME”:Y, “VECH_NO”:4587, “工资”:1500],[ “EMP_ID”:3, “NAME”:Z, “VECH_NO”:4007,” SALARY“:1800]}

我需要更新表上存在EMP_ID的完整记录,否则插入新记录。 postgreSQL中有任何构建函数可用于实现此目的。我引用这个https://www.postgresql.org/docs/9.3/static/functions-json.html但没有得到解决方案

1 个答案:

答案 0 :(得分:3)

首先,您的JSON格式不正确,我想其目的是:

[
    {"EMP_ID":1,"NAME":"Y","VECH_NO":4587,"SALARY":1500},
    {"EMP_ID":3,"NAME":"Z","VECH_NO":4007,"SALARY":1800}
]

假设以下表格定义:

CREATE TEMP TABLE employee_details(
    "EMP_ID" integer primary key,
    "NAME" text,
    "VECH_NO" integer,
    "SALARY" numeric
);

示例数据(仅显示更新):

INSERT INTO employee_details VALUES(1, 'X', 123, 123);

您可以先使用json_array_elements to make each array one row and json_populate_record to get each value as the original table type,如下所示:

SELECT r.*
FROM
    json_array_elements('[{"EMP_ID":1,"NAME":"Y","VECH_NO":4587,"SALARY":1500},{"EMP_ID":3,"NAME":"Z","VECH_NO":4007,"SALARY":1800}]') AS a(element),
    json_populate_record(NULL::employee_details, a.element) AS r;

有了这个,您可以简单地使用INSERT ... ON CONFLICT UPDATE

INSERT INTO employee_details("EMP_ID", "NAME", "VECH_NO", "SALARY")
(
    SELECT r."EMP_ID", r."NAME", r."VECH_NO", r."SALARY"
    FROM
        json_array_elements('[{"EMP_ID":1,"NAME":"Y","VECH_NO":4587,"SALARY":1500},{"EMP_ID":3,"NAME":"Z","VECH_NO":4007,"SALARY":1800}]') AS a(element),
        json_populate_record(NULL::employee_details, a.element) AS r
)
ON CONFLICT ("EMP_ID") DO
UPDATE SET
    "NAME" = EXCLUDED."NAME",
    "VECH_NO" = EXCLUDED."VECH_NO",
    "SALARY" = EXCLUDED."SALARY"
;

ON CONFLICT子句仅适用于9.5或更高版本。在此之前,您必须使用some tricks with loop and retry或可写的公用表表达式(尽管存在竞争条件问题);无论如何,如果您使用的是旧版本,则升级是一个很好的理由。