在一个语句中从 jsonb 列中删除多个键

Posted

技术标签:

【中文标题】在一个语句中从 jsonb 列中删除多个键【英文标题】:Remove multiple keys from jsonb column in one statement 【发布时间】:2018-11-26 23:43:07 【问题描述】:

我正在尝试从 jsonb 列中删除多个键。

我已经设法让它通过以下语句删除一个键:

UPDATE table_a
SET data_column = data_column #- 'attr_1'
WHERE type = 'type_a'

我知道那是一条路,所以我不能这样做: #- 'attr_1,attr_2

根据文档,我应该也可以做 - 'attr_1' 但这不起作用,否则我会尝试尝试 - 'attr_1,attr2'

【问题讨论】:

【参考方案1】:

这应该就像多次应用#- 运算符一样简单:

SELECT ' "a": 1, "b": 2, "c": 3 '::jsonb #- 'a' #- 'b';

 ?column? 
----------
 "c": 3
(1 row)

【讨论】:

现在看来很明显了。谢谢!【参考方案2】:

或减号运算符一次(但使用文本数组):

SELECT ' "a": 1, "b": 2, "c": 3 '::jsonb - 'a,b'::text[];
 ?column? 
----------
 "c": 3
(1 row)

【讨论】:

嘿@Gerard 你知道这是什么版本,当我尝试执行类似的操作时我得到operator does not exist: jsonb - text[] @GeorgeGreen,它是在 Postgre 10 中引入的 - postgresql.org/docs/10/functions-json.html【参考方案3】:

如果您需要删除多个非嵌套键,您可以使用- 运算符:

SELECT ' "a": 1, "b": 2, "c": 3 '::jsonb - ARRAY['a', 'b'];

【讨论】:

【参考方案4】:

减号的多种用法,如;

UPDATE table_a
SET data_column = data_column - 'attr_1'- 'attr_2'- 'attr_3'
WHERE type = 'type_a'

【讨论】:

【参考方案5】:

我们想从表templatessetting 中删除template_approval_typesetting 是 JSONb 列。

查询很简单:

UPDATE templates SET setting = setting::jsonb #- 'template_approval_type'

【讨论】:

【参考方案6】:
UPDATE table_a
SET data_column = data_column - 'attr_1'
WHERE type = 'type_a'; 

【讨论】:

虽然此代码可能会回答问题,但提供有关它如何和/或为什么解决问题的额外上下文将提高​​答案的长期价值。您可以在帮助中心找到更多关于如何写好答案的信息:***.com/help/how-to-answer。祝你好运?

以上是关于在一个语句中从 jsonb 列中删除多个键的主要内容,如果未能解决你的问题,请参考以下文章

定义表中不存在时删除 jsonb 键

我想在 PostgreSQL 的同一列中从另一个品牌中删除一些与一个品牌相关的客户

从 JSONB 列中的多个数组中过滤掉对象

通过 jsonb 列中的给定键/值对过滤行

使用 PostgreSQL 查询更新复杂 JSONB 对象以删除子子属性

如何在 C# WPF 中从 ListView/XML 中完全删除一个项目?