@valentinesowl
Инженер, программист

Как сделать UPDATE в JSONB?

Суть вопроса в следующем.
Существует таблица test с полями id и json. В поле json типа jsonb содержатся записи в формате json:
{
"a" : 5,
"b" : 5,
"c" : 5
}

Я могу выбрать данные запросом
SELECT json->'s' FROM test WHERE id = 5;
Каким образом можно сделать UPDATE json->'s' = 6;?
Каким образом можно добавить в этот объект новую пару ключ-значение json->'d' = 5?
  • Вопрос задан
  • 125 просмотров
Решения вопроса 1
TheDeadOne
@TheDeadOne
Седой и строгий
Придётся перезаписывать значение json-поля. Чтобы изменить "с" на 6:
UPDATE test
SET json = json || '{"c":6}'::jsonb
WHERE id = 5;

Чтобы добавить новый ключ:
UPDATE test
SET json = json || '{"d":5}'::jsonb
WHERE id = 5;
Ответ написан
Пригласить эксперта
Ответы на вопрос 1
0xD34F
@0xD34F
Версия postgres'а у вас какая? Если 9.5+, то, как нам подсказывает документация, есть оператор ||, позволяющий объединять jsonb значения.

В противном случае этот оператор можно определить самостоятельно... м-м-м, например так:
CREATE FUNCTION public.jsonb_merge(a jsonb, b jsonb)
  RETURNS jsonb AS
$$
  WITH json_key_value AS (
    SELECT * FROM jsonb_each(a)
    UNION ALL
    SELECT * FROM jsonb_each(b)
  )
  SELECT json_object_agg(key, value)::jsonb
  FROM json_key_value;
$$
LANGUAGE sql;

CREATE OPERATOR || (
  leftarg = jsonb,
  rightarg = jsonb,
  procedure = jsonb_merge,
  commutator = ||
);
Ответ написан
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через TM ID
Похожие вопросы