ОБНОВЛЕНИЕ столбца таблицы postgres - PullRequest
0 голосов
/ 31 декабря 2018

Я пытаюсь обновить таблицу столбцов в postgres, но я не знаю, как это сделать ...

У меня есть таблица с 3 столбцами, такими как псевдоним, цвет и JSON, который является строкойу этого есть объект вроде

{"value1":"answer1", "value2":"answer2" }

В столбце с json я хочу добавить псевдоним и значения цвета ...

Как это:

 {"value1":"answer1", "value2":"answer2", "nickname":"name1", "color":"red" }

Как я могу сделать это обновление?

Ответы [ 2 ]

0 голосов
/ 31 декабря 2018

Если вы хотите использовать существующие столбцы таблицы, вы можете использовать json_build_object.

UPDATE t 
    SET    json_col = ( replace(json_col :: text, '}', ',') 
            || replace(Json_build_object ('nickname', nickname, 
                 'color', color) :: text,'{', '' ) ) :: json ;

Операторы replace() помогают формировать строку json.Обратите внимание, что здесь я рассмотрел вашу строку как простую строку json (без вложенных массивов / jsons).

Демо

0 голосов
/ 31 декабря 2018

Если вы действительно хотите сделать это из Postgres, то вы можете попробовать использовать REGEXP_REPLACE:

WITH cte AS (
    SELECT '{"value1":"answer1", "value2":"answer2"}'::json AS col
)

UPDATE cte
SET col = REGEXP_REPLACE(col::text,
                         '\}$',
                         ', "nickname":"name1", "color":"red"}')::json;


{"value1":"answer1", "value2":"answer2", "nickname":"name1", "color":"red"}

Этот подход использует прямое манипулирование строкой, чтобы найти конец строки JSON, а затем вставитьновые пары ключ-значение.

Если вы использовали Postgres 9.5 или более позднюю версию, вам может потребоваться использовать оператор слияния || для добавления нового содержимого JSON.Поддержка Postgres для манипулирования JSON стала лучше в последних версиях, но версия 9.4 не предлагает много.

Кроме того, если вы могли бы справиться с этим из слоя Hibernate / JPA, это могло бы иметь больше смысла.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...