更新 postgres jsonb 列
updating postgres jsonb column
我的 table 列中有以下 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');
而且有效。
现在我有另一个 table 和 json 如下,
{
"a": {
"abc": 1,
"def": 2
},
"b": {
"abc": 1,
"def": 2
}
}
即使在这个 json 中,我也想做同样的事情。取出 "abc" 并引入带有一些默认值的 "mno" 。请帮我实现这个目标。
键 "a" 和 "b" 是动态的,可以更改。但是 "a" 和 "b" 的值将始终具有相同的键,但值可能会改变。
我需要一个通用逻辑。
要求二:
abc:true 应该转换为 xyz:1。
abc:false 应转换为 xyz:0。
由于您的 JSON 键可能多种多样,因此生成通用查询可能会很复杂。这是因为您需要在 json_set()
函数中给出路径。但如果没有实际价值,那就很难了。
一个简单的work-around是在JSON字符串的文本表示上使用regexp_replace()
函数来替换相关对象。
UPDATE my_table
SET my_data =
regexp_replace(my_data::text, '"abc"\s*:\s*\d+', '"mno":5', 'g')::jsonb
对于添加的要求 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;
我的 table 列中有以下 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');
而且有效。
现在我有另一个 table 和 json 如下,
{
"a": {
"abc": 1,
"def": 2
},
"b": {
"abc": 1,
"def": 2
}
}
即使在这个 json 中,我也想做同样的事情。取出 "abc" 并引入带有一些默认值的 "mno" 。请帮我实现这个目标。
键 "a" 和 "b" 是动态的,可以更改。但是 "a" 和 "b" 的值将始终具有相同的键,但值可能会改变。 我需要一个通用逻辑。
要求二:
abc:true 应该转换为 xyz:1。
abc:false 应转换为 xyz:0。
由于您的 JSON 键可能多种多样,因此生成通用查询可能会很复杂。这是因为您需要在 json_set()
函数中给出路径。但如果没有实际价值,那就很难了。
一个简单的work-around是在JSON字符串的文本表示上使用regexp_replace()
函数来替换相关对象。
UPDATE my_table
SET my_data =
regexp_replace(my_data::text, '"abc"\s*:\s*\d+', '"mno":5', 'g')::jsonb
对于添加的要求 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;