2017-09-27 71 views
0

我有一个应用程序的设置,看起来像这样的一个表:如何基于json键进行更新?

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

然后我收到一个JSON在我的触发功能是这样的:

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

如何执行更新基于从我的JSON的所有键?

回答

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键...

+0

我的表列是'代码'和'价值' –

+0

感谢您的更新,但你有办法循环通过每个JSON键和执行一个up日期在同一时间?将会有很多行要很快添加。 –