Postgres обновляет первую запись в столбце JSON для всех записей - PullRequest
0 голосов
/ 05 ноября 2018

Я использую postgres 9.6.1.

У меня есть таблица "orders", в которой есть столбец "orderData" типа JSON.

Как выглядит каждая запись в столбце orderData:

[{"orderId":1}, {"orderId":2}, {"orderId":3}]

Я пытаюсь написать SQL-запрос, который добавляет ключ к объекту первого порядка в каждом массиве.

Как должна выглядеть каждая запись в столбце orderData после запроса:

[{"orderId":1, "isFirstOrder": true}, {"orderId":2}, {"orderId":3}]

НЕ РАБОТАЕТ ПОПЫТКА:

WITH order AS (
  SELECT orderData
  FROM orders
  CROSS APPLY OPENJSON(c) s
  WHERE i = 1
)
UPDATE order
SET c = JSON_MODIFY(c, 'isFirstOrder', 'true');

Любая помощь будет принята с благодарностью.

1 Ответ

0 голосов
/ 05 ноября 2018

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

UPDATE orders
SET c = jsonb_set(c, '{0}', c -> 0 || '{"isFirstOrder": true}');
  1. c -> 0 получает первый элемент вашего массива
  2. || добавляет новый атрибут
  3. jsonb_set перезаписывает элементы, если они существуют, тогда как {0} определяет положение перезаписи в массиве

Функции Postgres JSON


Для типа json нет функции json_set. Таким образом, вы должны выполнить небольшое преобразование ваших json данных в jsonb и окончательный результат обратно в json:

UPDATE orders
SET c = jsonb_set(c::jsonb, '{0}', c::jsonb -> 0 || '{"isFirstOrder": true}')::json

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

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