【问题标题】:Remove multiple keys from jsonb column in one statement在一个语句中从 jsonb 列中删除多个键
【发布时间】: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'

【问题讨论】:

    标签: postgresql jsonb


    【解决方案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'; 
          

          【讨论】:

          • 虽然此代码可能会回答问题,但提供有关它如何和/或为什么解决问题的额外上下文将提高​​答案的长期价值。您可以在帮助中心找到更多关于如何写好答案的信息:stackoverflow.com/help/how-to-answer。祝你好运?
          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 2012-01-14
          • 1970-01-01
          • 1970-01-01
          • 2013-07-06
          • 2019-10-16
          • 2021-06-25
          • 1970-01-01
          相关资源
          最近更新 更多