栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 面试经验 > 面试问答

使用jsonb_set()进行条件更新

面试问答 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

使用jsonb_set()进行条件更新

平原

CASE
应该有所作为。

UPDATe table_ tSET    value_ = jsonb_set(value_, '{iProps}', sub2.new_prop, false)FROM  (   SELECt id        , jsonb_agg(jsonb_set(prop, '{value, rules}', new_rules, false)         ORDER BY idx1) AS new_prop   FROM  (      SELECt t.id, arr1.prop, arr1.idx1, jsonb_agg( **CASE WHEN jsonb_typeof(rule # > '{ao,sc}') = 'object'      THEN jsonb_set(rule, '{ao,sc}', rule #> '{ao,sc,name}', false)      ELSE rule END** ORDER BY idx2) AS new_rules      FROM table_ t         , jsonb_array_elements(value_->'iProps')       WITH ORDINALITY arr1(prop,idx1)         , jsonb_array_elements(prop->'value'->'rules') WITH ORDINALITY arr2(rule,idx2)      GROUP  BY t.id, arr1.prop, arr1.idx1      ) sub1   GROUP  BY id   ) sub2WHERe t.id = sub2.id;

db
<>在这里

拨弄 (Postgres 11!)

为了同时满足您在更新中添加的第二个过滤器(必须是一个 对象
),请使用进行检查

jsonb_typeof()

小提琴中的查询似乎不必要地复杂(tl;
dr)。同样,它不保留 数组元素的原始顺序 。如果实际上不相关,请省略

WITH ORDINALITY
ORDER BY
进一步简化:

UPDATe table_ tSET    value_ = jsonb_set(value_, '{iProps}', sub2.new_prop, false)FROM  (   SELECt id        , jsonb_agg(jsonb_set(prop, '{value, rules}', new_rules, false)) AS new_prop   FROM  (      SELECt t.id, prop, jsonb_agg(CASE WHEN jsonb_typeof(rule #> '{ao,sc}') = 'object'      THEN jsonb_set(rule, '{ao,sc}', rule #> '{ao,sc,name}', false)      ELSE rule END) AS new_rules      FROM table_ t         , jsonb_array_elements(value_->'iProps')       prop         , jsonb_array_elements(prop->'value'->'rules') rule      GROUP  BY t.id, prop      ) sub1   GROUP  BY id   ) sub2WHERe t.id = sub2.id;

db
<>在这里拨弄

通常,这仍会保留数组元素的顺序(与原始数组不同)。不能保证具有两个聚合级别。



转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/415879.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号