我确实弄清楚如何从一个数组中删除单个记录的值,但是如何为其中许多记录删除它.问题在于我如何使用子查询.因为它必须只返回单个元素.也许我的方法是错的.
Given input: '{attributes:['is_new','is_old']}' Expected result '{attributes: ['is_old']}' #remove 'is_new' from jsonb array
Real example: # sku | properties # -------+-------------------------------- # nu3_1 | { + # | "name": "silly_hodgkin",+ # | "type": "food",+ # | "attributes": [ + # | "is_gluten_free",+ # | "is_lactose_free",+ # | "is_new" + # | ] + # | }
#Query that removes single array element: 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 query that removes single array element in single record 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_set()
and the delete operator -
:
update catalog set properties = jsonb_set(properties,(properties->'attributes') - 'is_new');