sql - 使用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 语句,但它不能正常工作。不同的删除条件是:
- 当我要删除的 jsonb 值在默认值以及 image_set 中时,它应该从图像集中删除该值并使用图像集中的其他值更新默认值。
- 如果不是这样,它不会更新默认值,只会删除 image_set 值。
- 如果数组即 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 语句的支持,我将不胜感激。希望得到积极的回应。谢谢。
解决方案
推荐阅读
- node.js - Express 应用程序未在生产中连接到 MongoDB - 不知道为什么?
- android - withContext - ArrayIndexOutOfBoundsException
- laravel - 为什么登录后没有重定向到家?
- r - 如何计算产品从购买第一天起的移动平均年龄?
- r - R循环遍历lm函数中的自变量
- python - 尝试向 RESTful API 发送请求时收到“404”
- java - 如何向 Resttemplate exchange() 函数添加多个 uriVariable
- arrays - 如何将列表框中的所有选定数据存储在VBA中的数组中
- ruby-on-rails - SimpleForm(你能设置默认的 label_method 和 value_method 参数吗?)
- python - Keras fit_generator 一次训练一个样本,而我从生成器中生成多个样本