Обновление столбца postgres jsonb - PullRequest
0 голосов
/ 24 июня 2019

У меня ниже столбца 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 ]

1 голос
/ 27 июня 2019

Для добавленного требования 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;   
1 голос
/ 24 июня 2019

демо: дб <> скрипка

Из-за возможного разнообразия ваших ключей 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
...