[英]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.