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

