如何基于json密钥更新?

时间:2017-09-27 03:40:37

标签: json postgresql key

我有一个应用程序设置表,如下所示:

Code      | Value   |
---------------------
MAC_ADDR  | 'SAMPLE'|
PC_OPT    |   0     |
SHOW_ADDR |   1     |

然后我在我的触发器函数中收到一个json:

{MAC_ADDR: 'NEWADDR', PC_OPT: 1, SHOW_ADDR: 0}

如何根据json中的所有键执行更新?

1 个答案:

答案 0 :(得分:0)

你可以使用json_populate_record,例如:

t=# create table tj("MAC_ADDR" text, "PC_OPT" int, "SHOW_ADDR" int);
CREATE TABLE
t=# insert into tj select 'SAMPLE',0,1;
INSERT 0 1
t=# select * from tj;
 MAC_ADDR | PC_OPT | SHOW_ADDR
----------+--------+-----------
 SAMPLE   |      0 |         1
(1 row)

t=# update tj set "MAC_ADDR"=j."MAC_ADDR", "PC_OPT"=j."PC_OPT", "SHOW_ADDR"=j."SHOW_ADDR"
from json_populate_record(null::tj,'{"MAC_ADDR": "NEWADDR", "PC_OPT": 1, "SHOW_ADDR": 0}') j
where true;
UPDATE 1
t=# select * from tj;
 MAC_ADDR | PC_OPT | SHOW_ADDR
----------+--------+-----------
 NEWADDR  |      1 |         0
(1 row)

请记住 - 您没有指定PK或其他列来更新行,因此所有行都将在上面的示例中更新。哪种适合您的数据样本,但如果有更多数据则不适合

<强>更新

我误解了这个问题,在(code, value)表中它更容易,例如:

update some_tbl 
  set "Value" = '{"MAC_ADDR": "NEWADDR", "PC_OPT": 1, "SHOW_ADDR": 0}'::json->'MAC_ADDR' 
where "Code"='MAC_ADDR'

o再次使用上面的代码,您可以使用json键映射更新...