我有一個名為 PostgreSQL 的表files,其中包括一個名為 .jsonb 的表formats。雖然有些行是[null],但其他行具有這種結構的物件:
{
"thumbnail": {
"ext": ".jpg",
"url": "https://some-url.com/image01.jpg",
"name": "image01.jpg",
//...other properties
}
}
對于我要更新的每一行thumbnail.url并替換some-url為other-url.
我遠不是 PostgreSQL(或任何其他資料庫)方面的專家,經過一番閱讀,我嘗試在 pgAdmin 中運行以下查詢:
UPDATE files
SET formats = jsonb_set(formats, '{thumbnail.url}', REPLACE('{thumbnail.url}', 'some-url', 'other-url'))
我收到了這個錯誤:function jsonb_set(jsonb, unknown, text) does not exist
我試圖設定格式jsonb_set(formats::jsonb...),試圖定位'{thumbnail}'而不是'{thumbnail.url}'- 總是同樣的錯誤。
我究竟做錯了什么?還是 pgAdmin 真的不支持這個功能?如何使用 pgAdmin 查詢工具進行這樣的更新?
uj5u.com熱心網友回復:
我們可以嘗試使用->>獲取 JSON 內容值,url然后從中替換您的期望值。
因為您url的 JSON 欄位可能是字串型別,所以我們需要在"轉換為之前使用它來滿足它JSONB
jsonb_set(target jsonb, path text[], new_value jsonb [, create_missing boolean])
UPDATE files
SET formats = jsonb_set(formats, '{thumbnail,url}', CONCAT('"',REPLACE(formats->'thumbnail'->>'url','some-url','other-url'),'"')::JSONB);
sqlfiddle
uj5u.com熱心網友回復:
的第二個引數jsonb_set()必須是一個陣列,每個“路徑”元素都有一個陣列元素。所以第二個引數應該'{thumbnail,url}'或者更明顯:array['thumbnail', 'url']
并且第三個引數必須是一個jsonb值,但replace回傳一個text,所以你需要使用 egto_jsonb()將結果轉換replace()為一個 jsonb 值。
正如 D-Shih 指出的那樣,您需要使用->>. 但要獲取 URL,您需要“導航”到它:formats -> 'thumbnail ->> 'url'
我還將添加一個 WHERE 子句,以便您只更新實際包含 URL 的行。
UPDATE files
SET formats = jsonb_set(formats,
'{thumbnail,url}',
to_jsonb(replace(formats -> 'thumbnail' ->> 'url', 'some-url', 'other-url'))
)
where (formats -> 'thumbnail') ? 'url'
轉載請註明出處,本文鏈接:https://www.uj5u.com/qianduan/480001.html
標籤:PostgreSQL sql更新 jsonb
