首页 > 解决方案 > 使用case语句psql更新jsonb中的多个属性

问题描述

我正在尝试使用两个键更新 jsonb 列media,即 default** 是 jsonb 类型并且image_set是 jsonb 数组。

是否有单一选择更新语句的解决方案来更新两个键。test_media 表

id |                                                                         media                                                                         | name  
----+-------------------------------------------------------------------------------------------------------------------------------------------------------+-------
  2 | {"default": {"w1": "fff", "w2": "aaa", "w3": "ddd"}, "image_set": [{"w1": "fff", "w2": "aaa", "w3": "ddd"}, {"w1": "bbb", "w2": "rrr", "w3": "vvv"}]} | pooja

更新图像集

Update test_media 
  set media = media #- ('{image_set,'||(select pos-1 from test_media, jsonb_array_elements(media->'image_set') with ordinality arr(value, pos) where name='pooja' and value->>'w1'='fff') 
                       || '}')::text[] 
                       || jsonb_set(media, '{default}', '{"w1": "bbb", "w2": "rrr", "w3": "vvv"}' )
where name='pooja';

在这里,基于删除,我想根据不同的条件一起更新默认值和 image_set。默认jsonb 值来自image_set数组。我尝试使用 case 语句,但它不能正常工作。不同的删除条件是:

  1. 当我要删除的 jsonb 值在默认值以及 image_set 中时,它应该从图像集中删除该值并使用图像集中的其他值更新默认值。
  2. 如果不是这样,它不会更新默认值,只会删除 image_set 值。
  3. 如果数组即 image_set 的值为 1 ,则 media='{}' 更新为 null json。

尝试了两件事分别更新,default 和 image_set。

Update test_media 
   set media =  ( CASE 
                   WHEN jsonb_array_length(media->'image_set')::int > 1 
                      THEN (Select media #- ('{image_set,'||(select pos-1 from test_media , jsonb_array_elements(media->'image_set') with ordinality arr(value, pos) where name='pooja' and value->>'w1'='fff') || '}')::text[]) 
                   ELSE media = '{}' 
                   END IF
                ) 
where name='pooja';

在这里,我得到了错误:CASE types boolean and jsonb cannot be match 其次,

update test_media  
   set media = jsonb_set(media, '{default}', (select  from (select CASE WHEN media->'default'->>'w1'='fff' AND jsonb_array_length(media->'image_set')::int >0 THEN (select media->'image_set'->0 from test_media where name='pooja' ) WHEN  media->'default'->>'w1'='fff' AND jsonb_array_length(media->'image_set')::int = 0 THEN (select media - 'default' from test_media where name = 'pooja') END) As Sub), True) 
where name='pooja';

如果我使用 select update 获得对 case 语句的支持,我将不胜感激。希望得到积极的回应。谢谢。

更新多个 jsonb 列

更新-a-jsonb-data 中的多值

标签: sqljsonjsonbpostgresql-9.5

解决方案


推荐阅读