[英]PostgreSQL update JSONB column with value from another column
我想將數據從一列 (varchar) 遷移到另一列 (jsonb)
Column | Type | Modifiers
------------+-----------------------------+--------------------------------------------------------
id | integer | not null default nextval('merchants_id_seq'::regclass)
name | character varying | not null
nameb | jsonb | not null default '{}'::jsonb
所以nameb
將變成{"en": "$name"}
其中$name
是name
字段中的值。
例如:
選擇名稱,名稱 b
之前:
name | nameb
--------------------------------------+------------
hello | {}
world | {}
之后:
name | nameb
--------------------------------------+------------
hello | {"en": "hello"}
world | {"en": "world"}
對於常規類型,我可以執行UPDATE SET whatever = (SELECT ...)
,但是如何使用 jsonb 執行此操作?
UPDATE merchants SET nameb = (SELECT '{"en": "fillme!"}'::jsonb);
有效,但如何設置“fillme!” 來自另一個領域的價值?
我找到了解決方案:
UPDATE merchants AS m1
SET nameb = (
SELECT row_to_json(t) FROM (
SELECT name as en FROM merchants AS m2 WHERE m1.id = m2.id
) t
)::jsonb;
不確定它是否正確,但它有效
這可以通過 jsonb_build_object 函數來完成,該函數允許您從簡單的數據類型構建 json 對象。
所以做你想做的事:
update merchants set nameb = nameb || jsonb_build_object('en', name)
使用 json_build_object 我們正在根據“name”列中的值動態地制作 {"en": "hello"}, {"en": "world"} .. 之后,我們可以簡單地使用 || 連接到 jsonb 值運營商。
如果 nameb 為 NULL,這將不起作用,因為 NULL 將“吃掉”所有東西,結果將再次為 NULL。 在這種情況下,我建議使用 COALESCE:
update merchants set nameb = COALESCE(nameb, '{}') || jsonb_build_object('en', name)
實現相同的另一種方法是使用 jsonb_set 函數。 對於這種特殊情況,它有點矯枉過正,但是如果您需要在 json 深處的某個地方設置一些鍵,它可能會很方便:
update merchants set nameb = jsonb_set(nameb, '{en}', ('"' || name || '"')::jsonb)
這看起來很奇怪,因為我們必須構造由引號包圍的字符串,即: '"hello"' 將其設置為 'en' 鍵的值。 如果您需要設置一些 json, jsonb_build_object 更方便。
是的, jsonb_build_object
是最好的選擇。
UPDATE merchants
SET nameb = jsonb_build_object('en', "name",
'cs', '')
WHERE ...
創造
name | nameb
--------------------------+------------------------------
hello | {"en": "hello", "cs": ""}
world | {"en": "world", , "cs": ""}
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.