Фигурные скобки отсутствуют после замены данных JSON - PullRequest
0 голосов
/ 04 мая 2018

Следующие данные в таблице dashboard_data. Имя столбца mr_data.

{"priority_id": "123", "urgent_problem_id": "111", "important_problem_id": "222"}
{"priority_id": "456", "urgent_problem_id": "", "important_problem_id": "333"}
{"priority_id": "789", "urgent_problem_id": "444", "important_problem_id": ""}

query-

UPDATE
    dashboard_data
SET
    mr_data = replace(dashboard_data.mr_data,'urgent_problem_id','urgent_problem_ids')
WHERE
    mr_data->>'urgent_problem_id' IS NOT NULL;

Ожидаемый результат:

{"priority_id": "123", "urgent_problem_ids": {"111"}, "important_problem_ids": {"222"}}
{"priority_id": "456", "urgent_problem_ids": {""}, "important_problem_ids": {"333"}}
{"priority_id": "789", "urgent_problem_ids": {"444"}, "important_problem_ids": {""}}

Есть ли способ, чтобы при замене мы получали {} представление данных, как показано в ожидаемом результате.

1 Ответ

0 голосов
/ 04 мая 2018

Предполагается, что Postgres 9.5 или новее.

Вы можете использовать jsonb_set, чтобы добавить правильный массив JSON с новым ключом, а затем удалить старый ключ из JSON (это единственный способ переименовать ключ)

update dashboard_data
  set mr_data = jsonb_set(mr_data, '{urgent_problem_ids}', 
                          jsonb_build_array(mr_data -> 'urgent_problem_id'), true) 
                - 'urgent_problem_id'
where mr_data ? 'urgent_problem_id';

jsonb_build_array(mr_data -> 'urgent_problem_id') создает правильный массив JSON с (единственным) значением из urgent_problem_id, которое затем сохраняется под новым ключом urgent_problem_ids и, наконец, старый ключ urgent_problem_id удаляется с помощью оператора - .

Онлайн пример: http://rextester.com/POG52716


Если ваш столбец не является JSONB (что и должно быть), то вам нужно привести столбец внутрь jsonb_set() и привести результат обратно к json

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