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
相关产品推荐
相关产品推荐

