Я пытаюсь обновить столбец jsonb media с двумя ключами, т. е. default
** имеет тип jsonb, а image_set
— массив jsonb.
Есть ли решение для одного оператора обновления select для обновления обоих ключей. таблица 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, но он не работает нормально. Различные условия удаления:
- Когда значение jsonb, которое я хочу удалить, находится по умолчанию, а также в image_set, оно должно удалить это значение из набора изображений и обновить значение по умолчанию другим значением из набора изображений.
- Если это не так, он не будет обновлять значение по умолчанию, просто значение image_set будет удалено.
- Если значение массива, т. е. 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 и 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 с помощью выбора обновления. Надеюсь на положительный ответ. Спасибо.