postgresql 根据类型更新所有JSONB作用域数组元素

dfddblmv  于 2023-05-17  发布在  PostgreSQL
关注(0)|答案(1)|浏览(162)

我得到了以下schema:
| id::UUID| payload::JSONB|
| --------------|--------------|
| 1| [{“编辑”:[{“type”:“A”,“value”:1 },{“type”:“B”,“值”:2 }] }]|
| 二|[{“编辑”:[{“type”:“A”,“value”:1 },{“type”:“A”,“value”:2 }] }]|
| 三|[{“编辑”:[{“type”:“B”,“value”:1 }] }]|
| 四个|[{“编辑”:[[] }]|
对于payload的每个元素,我需要将value更新为对象。该对象的类型略有不同:
CASE type = A => value: { src: <prevVal> }
CASE type = B => value: { url: <prevVal> }
对于上面的例子,我期望得到:
| id::UUID| payload::JSONB|
| --------------|--------------|
| 1| [{“编辑”:[{“type”:“A”,“value”:{“src”:1 }},{“type”:“B”,“值”:{“url”:2 } }] }|
| 二|[{“编辑”:[{“type”:“A”,“value”:{“src”:1 }},{“type”:“A”,“value”:[2019 - 04 - 22]|
| 三|[{“编辑”:[{“type”:“B”,“value”:[1][2][3]|
| 四个|[{“编辑”:[[] }]|

h43kikqp

h43kikqp1#

首先展平payload阵列,然后用新的value重建它。

update the_table set payload =  
 (select jsonb_agg(p || jsonb_build_object(  
    'value', jsonb_build_object
    (
     case when p ->> 'type' = 'A' then 'src' else 'url' end, 
     (p ->> 'value')::integer
    )
  ))    
  from jsonb_array_elements(payload) p
 );

select * from the_table;
身份证有效载荷
1[{“type”:“A”,“value”:{“src”:1}},{“type”:“B”,“值”:[2019 - 04 - 22]
[{“type”:“A”,“value”:{“src”:1}},{“type”:“A”,“value”:[2019 - 04 - 22]
[{“type”:“B”,“value”:联系我们

参见demo
不相关,但JSON在您的示例中无效。

相关问题