平原
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
<>在这里拨弄
通常,这仍会保留数组元素的顺序(与原始数组不同)。不能保证具有两个聚合级别。



