从 postgres 中删除所有记录,其中 jsonb 包含键列表

问题描述 投票:0回答:2

我正在尝试删除 jsonb 有一个或多个键的记录。

我的数据-

id jsonb_col
1
[{"unit": "sale", "group": ["spares"]}]
2
[{"unit": "sale"}]
3
[{"member": "j1"}]

删除for key in (unit, group)后,我的数据应该是这样的-

id jsonb_col
3
[{"member": "j1"}]

我试过 cte 查询 -

WITH keys AS (
  SELECT jsonb_object_agg(key, null) AS keys 
  FROM unnest(ARRAY['unit', 'group']) AS key
) 
DELETE FROM my_table 
WHERE jsonb_col @> (SELECT keys FROM keys)

这给了我删除 0.

我的选择查询单独返回以下数据-

{"unit": null, "group": null}

有没有其他方法可以在没有 cte 的情况下使用 jsonb 中的键列表删除?

sql json postgresql sql-delete
2个回答
0
投票

一种选择是使用 EXISTS 子查询遍历数组元素并检查其中一个是否包含键

delete from the_table t
where exists (select *
              from jsonb_array_elements(t.jsonb_col) as x(item)
              where x.item ?| array['unit','group'])

另一种选择是使用 JSON 路径查询

delete from the_table
where jsonb_col @? '$[*].keyvalue() ? (@.key == "unit" || @.key == "group")'

0
投票

你也可以使用 jsonb_path_exists.

BEGIN;
CREATE temp TABLE test_mult_jsonb_keyt (
    id int,
    jsonb_col jsonb
) ON COMMIT DROP;
INSERT INTO test_mult_jsonb_keyt
    VALUES (1, jsonb'[{"unit": "sale", "group": ["spares"]}]'),
    (2, '[{"unit": "sale"}]'),
    (3, '[{"member": "j1"}]');
DELETE FROM test_mult_jsonb_keyt
WHERE jsonb_path_exists(jsonb_col, '$[*].unit')
    OR jsonb_path_exists(jsonb_col, '$[*].group')
RETURNING
    *;
TABLE test_mult_jsonb_keyt;
END;
© www.soinside.com 2019 - 2024. All rights reserved.