首页 > 解决方案 > 更新 postgres jsonb 列

问题描述

我的表列中有以下 json 字符串,它的类型为 jsonb,

{
    "abc": 1,
    "def": 2
}

我想从中删除“abc”键并插入带有一些默认值的“mno”。我遵循以下方法。

UPDATE books SET books_desc = books_desc - 'abc';
UPDATE books SET books_desc = jsonb_set(books_desc, '{mno}', '5');

它有效。

现在我有另一个带有 json 的表,如下所示,

{
    "a": {
        "abc": 1,
        "def": 2
    },
    "b": {
        "abc": 1,
        "def": 2
    }
}

即使在这个 json 中,我也想做同样的事情。取出“abc”并引入带有一些默认值的“mno”。请帮助我实现这一目标。

键“a”和“b”是动态的并且可以改变。但是“a”和“b”的值将始终具有相同的键,但值可能会改变。我需要一个通用的逻辑。

要求 2:

abc:true 应该转换为 xyz:1。

abc:false 应该被转换为 xyz:0。

标签: postgresqljsonb

解决方案


演示:db<>小提琴

由于您的 JSON 键可能多种多样,因此生成通用查询可能会很复杂。这是因为您需要在json_set()函数中给出路径。但是如果没有实际值,那就很难了。

一个简单的解决方法是使用regexp_replace()JSON 字符串的文本表示上的函数来替换相关对象。

UPDATE my_table
SET my_data = 
    regexp_replace(my_data::text, '"abc"\s*:\s*\d+', '"mno":5', 'g')::jsonb

推荐阅读