我正在尝试删除 jsonb 有一个或多个键的记录。
我的数据-
id | jsonb_col |
---|---|
1 |
|
2 |
|
3 |
|
删除for key in (unit, group)后,我的数据应该是这样的-
id | jsonb_col |
---|---|
3 |
|
我试过 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 中的键列表删除?
一种选择是使用 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")'
你也可以使用 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;