更新postgres jsonb列

时间:2019-06-24 09:20:50

标签: postgresql 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。

2 个答案:

答案 0 :(得分:1)

demo:db<>fiddle

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

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

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

答案 1 :(得分:1)

对于附加要求2:

我根据已经给出的解决方案编写了以下查询:

UPDATE books
SET book_info = 
    regexp_replace(book_info::text, '"abc"\s*:\s*true', '"xyz":1', 'g')::jsonb; 

UPDATE books
SET book_info = 
    regexp_replace(book_info::text, '"abc"\s*:\s*false', '"xyz":0', 'g')::jsonb;   
相关问题