从 JSONB 对象数组中删除整个对象的 PostgreSQL 调用是什么

What is the PostgreSQL call to remove an whole object from a JSONB array of Objects

table:测试 1 jsonB 列:COLUMN1

[{a: 1, b: 2, c:3},
{a: 4, b: 5, c:6},
{a: 7, b: 8, c:9}]

我想 select a = 4 的值并删除它所属的整个对象以获得如下结果 [{a: 1, b: 2, c:3}, {a: 7, b: 8, c:9}]

我可以用WHERE COLUMN1->>'a' = 4

定位记录

但我无法弄清楚或如何找到这个基本用例:例如,从数组中删除一个对象作为 JSONB 列的一部分

一条或多条记录

是的,您可以通过 jsonb_array_elements() 函数的贡献将等式替换为不等式来反向使用过滤逻辑,如 WHERE COLUMN1->>'a' != 4,然后应用 jsonb_agg() 函数,如下所示:

SELECT ID, jsonb_agg(elm) AS "Result"
  FROM tab t
 CROSS JOIN jsonb_array_elements(jsdata) AS elm
 WHERE (elm ->> 'a')::int != 4
 GROUP BY ID

Demo

创建TABLE 选项卡(ID INT,jsdata jsonb)

插入选项卡值 (1,'[{"a": 1, "b": 2, "c":3},{"a": 4, "b": 5, "c":6},{"a": 7, "b": 8, "c":9}]'::jsonb), (2,'[{"a": 4, "b": 2, "c":3},{"a": 9, "b": 5, "c":6},{"a": 7, "b": 8, "c":9}]'::jsonb)

更新选项卡 t1 SET jsdata = ( SELECT jsonb_agg(榆树) 从选项卡 t2 交叉连接 jsonb_array_elements(jsdata) 作为榆树 WHERE (elm->>'a')::int != 4 和 t2.ID = 2 按 t2.ID 分组) 其中 t1.ID = 2

结果: 1,'[{“a”:1,“b”:2,“c”:3},{“a”:4,“b”:5,“c”:6},{“a”:7 , "b": 8, "c":9}]', 2,'[{"a": 9, "b": 5, "c":6},{"a": 7, "b": 8, "c":9}]'