我想更新表(示例)中的 jsonb 列:
CREATE TEMPORARY TABLE tmp_1 AS
SELECT 1 as id,'{"foo":1,"bar":2,"foo_bar":3}'::jsonb as jb_value;
以這種更新的方式:
UPDATE tmp_1
SET jb_value = jb_value || '{"foo_bar":4, "foo_foo_bar":4}'
WHERE id = 1;
將回傳類似于:
Result:
{"foo":1,"bar":2,"foo_bar":[3,4],"foo_foo_bar":4}
||操作員不適合我,因為根據 do docs:
注意:|| 運算子通過生成一個包含它們的鍵的聯合的物件來連接兩個 JSON 物件,當有重復的鍵時取第二個物件的值。所有其他情況都會生成一個 JSON 陣列:首先,任何非陣列輸入都被轉換為一個單元素陣列,然后將這兩個陣列連接起來。它不會遞回操作;僅合并頂級陣列或物件結構。
這將回傳 key 的替換值"foo_bar",這是我不想要的:
Result:
{"foo":1,"bar":2,"foo_bar":4,"foo_foo_bar":4}
我也接受jsonb_insert并jsonb_set接受了考慮,但我不知道要更新或插入的密鑰的路徑。
提前致謝 !
uj5u.com熱心網友回復:
嘗試這個 :
SELECT jsonb_object_agg( COALESCE(a.key, b.key)
, CASE
WHEN a.key IS NULL THEN b.value
WHEN b.key IS NULL THEN a.value
ELSE '[]' :: jsonb || a.value || b.value
END
)
FROM jsonb_each('{"foo":1,"bar":2,"foo_bar":3}'::jsonb) AS a
FULL OUTER JOIN jsonb_each('{"foo_bar":4, "foo_foo_bar":4}' :: jsonb) AS b
ON a.key = b.key
http://sqlfiddle.com/#!17/9eecb/84825
您可以將此查詢插入到 UPDATE 陳述句中。
轉載請註明出處,本文鏈接:https://www.uj5u.com/qita/366792.html
