Postgresql
通過其他屬性更新 postgres json 值
我正在使用 PostgreSQL 9.6,我得到了下表:
汽車
ID Name Data 1 abc {"color":"red","wheels":4,"my-value":false} 2 def {"color":"blue","wheels":8} 3 xyz {"color":"yellow","my-value":true}
我想通過添加另一個名為“new-attr”的布爾屬性來擴展數據 JSON 對象,該屬性應該獲得 JSON 欄位的“my-value”的確切值。
例如,如果 ID 1 中的“my-value”為 false,則“new-attr”將為 false。如果未設置,則根本不要添加它(如數字 2)。
我嘗試了以下方法,但沒有幫助:
UPDATE cars SET data=jsonb_set(data,'{new-attr}',data->'my-value')
我希望得到以下 JSON:
ID Name Data 1 abc {"color":"red","wheels":4,"my-value":false,"new-attr":false} // same value 2 def {"color":"blue","wheels":8} // no change 3 xyz {"color":"yellow","my-value":true,"new-attr":true} // same value true
有什麼建議麼 ?
連接運算符
||
將執行此操作:update the_table set data = data || jsonb_build_object('new-attr', data -> 'my-value') where data ? 'my-value'; --<< only update rows that contain the key
操作員測試該
?
鍵是否存在於 JSON 值中。如果您的列被定義為
json
(而不是jsonb
應該是),您可能需要強制轉換它,以使||
運算符正常工作:data::jsonb || ...
您可以保留目前的 UPDATE 語句,但添加
WHERE data ? 'my-value'
它以避免更新沒有您想要更新的行。當 v13 發佈時,您可以使用新
jsonb_set_lax
功能:UPDATE cars SET data=jsonb_set_lax( data, '{new-attr}', data->'my-value', true, 'return_target');
但這似乎比僅僅添加一個 WHERE 子句對你來說更多的工作和對伺服器的更多工作和更難閱讀。