我已经弄清楚如何从数组中移除单个记录的值,但如何对多个记录进行操作呢?问题出在我的子查询使用方式上。因为它必须只返回单个元素。也许我的方法是错误的。
给定输入:'{attributes:['is_new', 'is_old']}' 期望结果 '{attributes: ['is_old']}' #从jsonb数组中删除'is_new'
真实示例: # sku | properties # ------- + -------------------------------- # nu3_1 | {+ # | "name": "silly_hodgkin",+ # | "type": "food",+ # | "attributes": [+ # | "is_gluten_free",+ # | "is_lactose_free",+ # | "is_new"+ # | ]+ # | }
删除单个数组元素的查询语句:
SELECT c.sku,jsonb_agg(el) FROM catalog c JOIN (select sku,jsonb_array_elements_text(properties->'attributes')as el from catalog)c2 ON c.sku=c2.sku where el 'is_new' GROUP BY c.sku;
在单个记录中删除单个数组元素的更新查询语句:
UPDATE catalog SET properties=jsonb_set(properties, '{attributes}', ( SELECT jsonb_agg(el) FROM catalog c JOIN (select sku, jsonb_array_elements_text(properties->'attributes') as el from catalog) c2 ON c.sku=c2.sku WHERE el 'is_new' AND c.sku='nu3_1' GROUP BY c.sku ) ) WHERE sku='nu3_1';
问题是如何按值从jsonb数组中删除多个数据库记录?
给定输入:'{attributes:['is_new', 'is_old']}' 期望结果 '{attributes: ['is_old']}' #从jsonb数组中删除'is_new'
真实示例: # sku | properties # ------- + -------------------------------- # nu3_1 | {+ # | "name": "silly_hodgkin",+ # | "type": "food",+ # | "attributes": [+ # | "is_gluten_free",+ # | "is_lactose_free",+ # | "is_new"+ # | ]+ # | }
删除单个数组元素的查询语句:
SELECT c.sku,jsonb_agg(el) FROM catalog c JOIN (select sku,jsonb_array_elements_text(properties->'attributes')as el from catalog)c2 ON c.sku=c2.sku where el 'is_new' GROUP BY c.sku;
在单个记录中删除单个数组元素的更新查询语句:
UPDATE catalog SET properties=jsonb_set(properties, '{attributes}', ( SELECT jsonb_agg(el) FROM catalog c JOIN (select sku, jsonb_array_elements_text(properties->'attributes') as el from catalog) c2 ON c.sku=c2.sku WHERE el 'is_new' AND c.sku='nu3_1' GROUP BY c.sku ) ) WHERE sku='nu3_1';
问题是如何按值从jsonb数组中删除多个数据库记录?
UPDATE
语句中一样添加where子句,请参见此示例。 - klinparents
的字段,其内容为[123, 345, 789]
,我是否可以使用jsonb_set
删除其中的一个元素,例如123
?还有其他解决方案吗? - Brook