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

PostgreSQL中如何用单SQL语句为jsonb已有键追加值并更新其他键

用单条PostgreSQL语句实现jsonb字段更新

当然可以!完全不需要借助Node.js查询后再做更新,PostgreSQL的jsonb函数足够强大,一条SQL就能完成你想要的操作。下面分两种场景给出解决方案:

场景1:手动追加固定的数字序列

如果你的drivers字段需要从"15"变成"15,16,...,26"(手动指定追加内容),可以用jsonb_set嵌套更新两个字段:

UPDATE your_table
SET your_json_column = jsonb_set(
    -- 先更新updatedat为当前时间
    jsonb_set(your_json_column, '{updatedat}', to_jsonb(now())),
    -- 再更新drivers,拼接原有值和新的数字串
    '{drivers}',
    to_jsonb(
        concat(
            -- 处理原有drivers可能为空的情况,避免拼接出null
            COALESCE(jsonb_extract_path_text(your_json_column, 'drivers'), ''),
            ',16,17,18,19,20,21,22,23,24,25,26'
        )
    )
)
-- 务必加上过滤条件,否则会更新表中所有行!
WHERE id = 123; -- 替换成你的实际过滤条件

场景2:自动生成连续数字序列(15到26)

如果drivers需要的是从15到26的连续数字串,不用手动写每个数字,PostgreSQL可以帮你自动生成:

UPDATE your_table
SET your_json_column = jsonb_set(
    jsonb_set(your_json_column, '{updatedat}', to_jsonb(now())),
    '{drivers}',
    to_jsonb(
        -- 生成15到26的数字,拼接成逗号分隔的字符串
        string_agg(num::text, ',')
        FROM generate_series(15, 26) num
    )
)
WHERE id = 123; -- 替换成你的实际过滤条件

关键细节说明

  • jsonb_set:PostgreSQL专门用于更新jsonb字段的函数,语法是jsonb_set(原jsonb, '{键路径}', 新值),嵌套使用可以同时更新多个键。
  • now():返回当前带时区的时间,如果你需要不带时区的时间,可以替换成CURRENT_TIMESTAMP或LOCALTIMESTAMP。
  • COALESCE:用来处理原有drivers键不存在或值为null的情况,确保拼接不会出现异常。
  • 必须加WHERE条件:如果漏掉WHERE,会把表中所有行的jsonb字段都更新,这通常不是你想要的结果!

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.29 07:57:44