使用case语句psql更新jsonb中的多个属性

时间:2018-06-10 17:05:22

标签: sql json jsonb postgresql-9.5

我正在尝试用两个键来更新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 =' {}'更新 to null json。
  4. 尝试分别更新两件事,默认和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类型boolean和jsonb无法匹配 其次,

    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语句,我将感激不尽。希望得到积极的回应。感谢。

    updating multiple jsonb column

    update-multiple-values-in-a-jsonb-data

0 个答案:

没有答案