postgresql 从postgres中删除jsonb包含键列表的所有记录

vfh0ocws  于 2023-04-05  发布在  PostgreSQL
关注(0)|答案(2)|浏览(191)

我正在尝试删除jsonb有一个或多个键的记录。
我的数据-
| 身份证|jsonb_col|
| --------------|--------------|
| 1|[{"unit": "sale", "group": ["spares"]}]|
| 第二章|[{"unit": "sale"}]|
| 三|[{"member": "j1"}]|
删除key in(unit,group)后,我的数据应该是这样的-
| 身份证|jsonb_col|
| --------------|--------------|
| 三|[{"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}

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

sd2nnvve

sd2nnvve1#

一种选择是使用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")'
lsmepo6l

lsmepo6l2#

您也可以使用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;

相关问题