PostgreSQL如何用单条UPDATE语句同时更新JSONB的两个嵌套属性
单条UPDATE更新JSONB多字段解决方案
完全可以通过单条UPDATE语句完成两个字段的同时更新,无需分开执行,常见有两种实现方案:
方案1:嵌套调用JSONB_SET
利用JSONB_SET返回修改后JSONB对象的特性,嵌套调用即可连续修改多个路径的字段:
UPDATE toys SET data = JSONB_SET( JSONB_SET(data, '{toy,available}', 'false'::jsonb), '{toy,price}', '0'::jsonb ) WHERE data->'toy'->>'id' = '27';
该方案的执行逻辑是先修改available字段,再基于修改后的结果修改price字段,全程只对符合条件的行做一次更新操作。
方案2:使用||合并操作符
如果需要修改的字段较多,嵌套写法可读性较差,可以用JSONB的合并操作符直接覆盖对应字段,写法更直观:
UPDATE toys SET data = data || jsonb_build_object( 'toy', data->'toy' || jsonb_build_object('available', false, 'price', 0) ) WHERE data->'toy'->>'id' = '27';
该方案先把需要修改的键值对和原toy子对象合并(重复键会用右侧的新值覆盖),再把新的toy对象合并回原data字段中。
两种方案的执行效果和你原有两条UPDATE语句的效果完全一致,且性能更优,避免了两次扫描匹配相同行的开销。
内容的提问来源于stack exchange,提问作者Benk I
相关产品推荐
相关产品推荐

