You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

PostgreSQL:如何复制jsonb字段值至新字段并修正标量提取错误?

问题分析与解决方案

问题原因

你使用的jsonb_array_elements是用于遍历JSON数组的函数,但你的Details->'Type'是一个标量值(字符串"VIP"),并非数组类型。这个函数无法从标量中提取数组元素,因此触发了"Can't extract scalar value"错误。

解决方案

以下是几种可行的更新方法,都能实现你想要的效果:

方法1:嵌套调用jsonb_set

先添加Subscription字段,再修改Type的值:

UPDATE "Media"
SET "Details" = jsonb_set(
    -- 第一步:新增Subscription字段,值为原Type的内容
    jsonb_set("Details", '{Subscription}', "Details"->'Type', true),
    -- 第二步:修改Type字段为2
    '{Type}', '2'::jsonb, false
);
  • jsonb_set的第三个参数直接传入Details->'Type'即可,它本身就是符合要求的jsonb标量值,无需额外处理。
  • 最后一个参数true表示允许新增字段,false表示仅修改已存在的字段。

方法2:使用jsonb合并操作符||

通过合并新的键值对来实现更新,更简洁:

UPDATE "Media"
SET "Details" = 
    -- 新增Subscription字段
    ("Details" || jsonb_build_object('Subscription', "Details"->'Type'))
    -- 修改Type字段为2
    || jsonb_build_object('Type', 2);
  • jsonb_build_object可以安全地构造jsonb对象,避免手动拼接字符串带来的转义问题。
  • ||操作符会自动合并两个jsonb对象,重复的键会以右侧的值为准。

方法3:直接构造完整的jsonb对象

如果表中Details的字段较少,直接构造新对象更直观:

UPDATE "Media"
SET "Details" = jsonb_build_object(
    'Type', 2,
    'Quantity', "Details"->'Quantity',
    'Subscription', "Details"->'Type'
);
  • 这种方式明确指定每个字段的值,可读性强,适合字段固定且数量不多的场景。

内容的提问来源于stack exchange,提问作者Robert

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.22 12:45:51