Перейти к содержимому
Последнее обновление

JSON_INSERT

Описание​

Функция JSON_INSERT вставляет данные в JSON и возвращает результат.

Синтаксис​

JSON_INSERT (<json_object>, <path>,  <value>[, <path>,  <value>, ...])

Параметры​

  • <json_object>: выражение типа JSON, задающее изменяемый объект.
  • <path>: выражение строкового типа, задающее путь для вставки значения
  • <value>: значение типа JSON или другого типа, поддерживаемого TO_JSON, которое требуется вставить.

Возвращаемое значение​

  • Nullable(JSON) Возвращает изменённый объект JSON

Примечания по использованию​

  1. Обратите внимание, что пары «путь — значение» обрабатываются слева направо.
  2. Если значение, на которое указывает <path>, уже существует в объекте JSON, вставка не выполняется.
  3. <path> не может содержать подстановочные знаки. При их наличии возникает ошибка.
  4. Если <path> содержит несколько уровней пути, все уровни, кроме последнего, должны существовать в объекте JSON.
  5. Если <path> указывает на элемент массива, но объект фактически не является массивом, этот объект становится первым элементом массива, после чего обработка продолжается как для обычного массива.
  6. Если <json_object> или <path> равен NULL, возвращается NULL. Если <value> равен NULL, вставляется значение JSON null.

Примеры​

  1. Пары «путь — значение» обрабатываются слева направо
    select json_insert('{}', '$.k', json_parse('{}'), '$.k.k2', 123);
    +-----------------------------------------------------------+
    | json_insert('{}', '$.k', json_parse('{}'), '$.k.k2', 123) |
    +-----------------------------------------------------------+
    | {"k":{"k2":123}} |
    +-----------------------------------------------------------+
  2. Значение, на которое указывает <path>, уже существует в объекте JSON
    select json_insert('{"k": 1}', "$.k", 2);
    +-----------------------------------+
    | json_insert('{"k": 1}', "$.k", 2) |
    +-----------------------------------+
    | {"k":1} |
    +-----------------------------------+
  3. <path> не может содержать подстановочные знаки
    select json_insert('{"k": 1}', "$.*", 2);
    ERROR 1105 (HY000): errCode = 2, detailMessage = [INVALID_ARGUMENT] In this situation, path expressions may not contain the * and ** tokens or an array range, argument index: 1, row index: 0
  4. Создание многоуровневых путей невозможно
    select json_insert('{}', '$.k1.k2.k3', 123);
    +--------------------------------------+
    | json_insert('{}', '$.k1.k2.k3', 123) |
    +--------------------------------------+
    | {} |
    +--------------------------------------+
  5. Автоматическое преобразование в массив
    select json_insert('{"k": "v"}', '$[1]', 123);
    +----------------------------------------+
    | json_insert('{"k": "v"}', '$[1]', 123) |
    +----------------------------------------+
    | [{"k": "v"}, 123] |
    +----------------------------------------+
    select json_insert('{"k": "v"}', '$.k[1]', 123);
    +------------------------------------------+
    | json_insert('{"k": "v"}', '$.k[1]', 123) |
    +------------------------------------------+
    | {"k": ["v", 123]} |
    +------------------------------------------+
  6. Параметры со значением NULL
    select json_insert(NULL, '$[1]', 123);
    +--------------------------------+
    | json_insert(NULL, '$[1]', 123) |
    +--------------------------------+
    | NULL |
    +--------------------------------+
    select json_insert('{"k": "v"}', NULL, 123);
    +--------------------------------------+
    | json_insert('{"k": "v"}', NULL, 123) |
    +--------------------------------------+
    | NULL |
    +--------------------------------------+
    select json_insert('{"k": "v"}', '$.k[1]', NULL);
    +-------------------------------------------+
    | json_insert('{"k": "v"}', '$.k[1]', NULL) |
    +-------------------------------------------+
    | {"k": ["v", null]} |
    +-------------------------------------------+