обновить несколько атрибутов в jsonb с помощью оператора case psql - PullRequest
0 голосов
/ 10 июня 2018

Я пытаюсь обновить столбец jsonb media , используя два ключа, т.е. default** имеет тип jsonb, а image_set - массив jsonb.

Есть ли решение для отдельного оператора выбора обновлений для обновления обоих ключей.test_media table

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 case, но он не работает нормально.Различные условия удаления:

  1. Когда значение jsonb, которое я хочу удалить, используется по умолчанию, а также в image_set, оно должно удалить это значение из набора изображений и обновить значение по умолчанию другим значением из изображенияset.
  2. Если это не так, он не будет обновлять значение по умолчанию, будет удалено только значение image_set.
  3. Если значение массива, т. Е. Image_set, равно 1, то media = '{}' обновляется до null json.

Пробовал две вещи обновлять отдельно, по умолчанию и 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';

Я был бы благодарен, если бы получил поддержку оператора case с использованием select update.Надеюсь на положительный ответ.Спасибо.

обновление нескольких столбцов jsonb

обновление нескольких значений в jsonb-данных

...