Postgresql

通過其他屬性更新 postgres json 值

  • August 24, 2020

我正在使用 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 子句對你來說更多的工作和對伺服器的更多工作和更難閱讀。

引用自:https://dba.stackexchange.com/questions/274225