在PostgreSQL中更新Jsonb数据

hgc7kmma  于 2023-04-08  发布在  PostgreSQL
关注(0)|答案(3)|浏览(146)

我有一个Jsonb字段表,需要更新Jsonb字段的数据。
数据存储如下:

[{"DOB": "04-May-2006", "Code": "2009585", "Class" : "I - Noon"}]

我需要将类键从“Noon”替换为“NS”。
我也检查了现有的答案,但所有的工作数据与单一对象如下

{"DOB": "04-May-2006", "Code": "2009585", "Class" : "I - Noon"}

我需要使用多个对象更新[]
这里是小提琴为相同的尝试
https://dbfiddle.uk/zyDBkmB7

bjg7j2ky

bjg7j2ky1#

使用jsonb_set

UPDATE content
SET "UserDetails" = jsonb_set("UserDetails", '{0, Class}', '"I - NS"')
WHERE id = 0;

参见:https://dbfiddle.uk/JJu4oxx8
你可能需要这个:

WHERE "UserDetails" -> 0 ->> 'Class' = 'I - Noon';
jq6vz3qz

jq6vz3qz2#

使用子查询从数组中提取所有元素,更改内容并创建新的新鲜数组:

UPDATE content
SET "UserDetails" = 
  (
   SELECT jsonb_agg(jsonb_set(d, '{Class}', '"I - NS"'))
   FROM   jsonb_array_elements("UserDetails") d
   )
WHERE id = 0;
2eafrhcq

2eafrhcq3#

你可以使用jsonb_setREPLACE来更新你的对象:

UPDATE content
SET UserDetails = jsonb_set(UserDetails::jsonb,
                            '{0,Class}',
                             (REPLACE ((UserDetails->0->'Class')::varchar, 'Noon', 'NS'))::jsonb
                           )
WHERE id = 0;

如果数组中有多个元素,则使用jsonb_array_elements为每个对象生成行,并使用jsonb_agg对这些更新的对象进行分组:

UPDATE content
SET "UserDetails" = 
  (
   SELECT jsonb_agg(jsonb_set(userDetail, '{Class}', 
                            (REPLACE ((userDetail->'Class')::varchar, 'Noon', 'NS'))::jsonb)
                   )
   FROM   jsonb_array_elements("UserDetails") userDetail
   )
WHERE id = 1;

Demo here

相关问题