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

如何在PostgreSQL中根据ID更新jsonb数组对象的price属性

PostgreSQL更新JSONB数组中指定元素的Price值

先确认目标行

先执行查询定位包含指定ID元素的行,避免误更新:

SELECT *
FROM your_table_name
WHERE bids @> '[{"id": "f0d1d36a-f6af-409e-968e-54c1dc104566"}]';

这里@>是JSONB的包含运算符,用来检查数组中是否存在携带目标ID的对象。

执行更新操作

根据你的PostgreSQL版本,有两种实用写法可选:

方法一(兼容多数版本)

通过拆分数组找到目标元素的索引,再用jsonb_set修改对应字段:

UPDATE your_table_name
SET bids = jsonb_set(
    bids,
    ARRAY[(idx - 1)::text, 'price'],
    '150'::jsonb,
    false
)
FROM jsonb_array_elements(bids) WITH ORDINALITY arr(elem, idx)
WHERE arr.elem->>'id' = 'f0d1d36a-f6af-409e-968e-54c1dc104566'
AND your_table_name.bids @> '[{"id": "f0d1d36a-f6af-409e-968e-54c1dc104566"}]';

注:WITH ORDINALITY返回的索引从1开始,JSON数组索引从0开始,所以需要idx - 1转换路径。

方法二(PostgreSQL 12+推荐)

用JSON路径直接定位目标元素,写法更简洁:

UPDATE your_table_name
SET bids = jsonb_set(
    bids,
    '$[*] ? (@.id == "f0d1d36a-f6af-409e-968e-54c1dc104566").price',
    '150'::jsonb,
    false
)
WHERE jsonb_path_exists(bids, '$[*] ? (@.id == "f0d1d36a-f6af-409e-968e-54c1dc104566")');
  • $[*] ? (@.id == "目标ID"):遍历数组所有元素,筛选出ID匹配的项
  • jsonb_set第四个参数false表示只修改第一个匹配元素,若需替换所有相同ID的元素,改为true即可
  • WHERE条件确保只更新包含目标元素的行,避免无效操作

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.02 21:25:24