2017-09-27 1 views
0

J'ai une table d'un cadre d'application qui ressemble à ceci:Comment mettre à jour en fonction des clés json?

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

Je reçois un JSON dans ma fonction de déclenchement comme ceci:

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

Comment puis-je effectuer une mise à jour sur la base sur toutes les clés de mon json?

Répondre

0

vous pouvez simplement utiliser json_populate_record, par exemple:

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) 

garder à l'esprit - vous ne spécifiez pas PK ou une autre colonne de mettre à jour les lignes si toutes les lignes seront mis à jour dans l'exemple ci-dessus. Ce qui convient à votre échantillon de données, mais ne serait pas en cas de données plus

Mise à jour

j'ai mal compris la question, dans (code, value) table, il est encore plus facile, par exemple:

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

o à nouveau, en utilisant le code ci-dessus vous pouvez mettre à jour la carte avec les clés json ...

+0

mes colonnes de table sont 'Code' &' Value' –

+0

merci pour la mise à jour, mais avez-vous un moyen de faire défiler chaque clé JSON et tout en effectuant un up date en même temps? Il y aura des tonnes de rangées à ajouter bientôt. –