0

表:TEST1 jsonB 列:COLUMN1

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

我想选择 a = 4 的值并删除它作为结果的一部分的整个对象,如下所示 [{a: 1, b: 2, c:3}, {a: 7, b: 8, c:9}]

我可以找到记录WHERE COLUMN1->>'a' = 4

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

对于一个或多个记录

4

2 回答 2

2

是的,您可以反向使用过滤逻辑,例如WHERE COLUMN1->>'a' != 4通过函数的贡献将相等替换为不等jsonb_array_elements(),然后应用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

于 2020-06-19T18:30:42.620 回答
1

创建表选项卡(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)

UPDATE tab t1 SET jsdata = ( SELECT jsonb_agg(elm) FROM tab t2 CROSS JOIN jsonb_array_elements(jsdata) AS elm WHERE (elm->>'a')::int != 4 AND t2.ID = 2 GROUP BY 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}]'

于 2020-07-25T13:02:23.187 回答