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

JSON_EXTRACT

Описание​

Извлекает поле, заданное json_path, из данных типа JSON.

Синтаксис​

JSON_EXTRACT (<json_object>, <path>[, <path2>, ...])

Параметры​

ПараметрОписание
<json_object>Обязательный параметр. Значение JSON или корректный текст JSON, который можно преобразовать в JSON.
<path>Обязательный параметр. Путь JSON типа STRING; для обхода массивов используйте явный подстановочный знак.
<path2>, ...Необязательные дополнительные пути типа STRING; найденные результаты объединяются в массив JSON.

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

Возвращает SQL NULL, если хотя бы один аргумент равен NULL или ни один путь не дал совпадений.

  • Nullable(JSON): Возвращает элемент JSON, на который указывает <path>. Если найдено несколько совпадений, они возвращаются в виде массива JSON.

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

  • Если <json_object> равен NULL или <path> равен NULL, возвращается NULL.
  • Если передан единственный параметр <path> и путь <path> не существует, возвращается NULL.
  • Если передано несколько параметров <path>, несуществующие пути игнорируются, а найденные элементы возвращаются в виде массива JSON. Если совпадений нет, возвращается NULL.
  • Если <path> не является допустимым путём, возникает ошибка.
  • Если значение, соответствующее <path>, является строкой, возвращаемая строка будет заключена в двойные кавычки ("). Чтобы получить результат без двойных кавычек, используйте функцию JSON_UNQUOTE.
  • Синтаксис <path>:
    • $ обозначает корень JSON
    • .k1 обозначает элемент с ключом k1 в объекте JSON
      • Если значение ключа содержит ".", в <path> необходимо использовать двойные кавычки, например SELECT json_extract('{"k1.a":"abc","k2":300}', '$."k1.a"');
    • [i] обозначает элемент с индексом i в массиве JSON
      • Чтобы получить последний элемент json_array, можно использовать $[last], предпоследний элемент — $[last-1] и так далее.
    • * обозначает подстановочный знак: $.* обозначает все члены корневого объекта, а $[*] обозначает все элементы массива.
    • ** используется в сочетании с '′;′'; '**' обозначает все пути (включая вложенные пути любой глубины).
  • Если <path> содержит подстановочные знаки (*), найденные результаты возвращаются в виде массива.
  • <path> не применяется автоматически к каждому элементу массива. Если <json_object> является массивом JSON, а <path> равен $.k, результат равен NULL: $.k обращается только к членам объекта. Чтобы обратиться к элементу по индексу, используйте $[i].k; чтобы извлечь поле из каждого элемента массива, используйте синтаксис с подстановочным знаком $[*].k, который поддерживается начиная с Doris 4.0.

Примеры​

  1. Обычные параметры
SELECT JSON_EXTRACT('{"k1":"v31","k2":300}', '$.k1');
+-----------------------------------------------+
| JSON_EXTRACT('{"k1":"v31","k2":300}', '$.k1') |
+-----------------------------------------------+
| "v31" |
+-----------------------------------------------+

Примечание: результат возвращается в виде "v31", а не v31.

  1. Параметры со значением NULL

    select JSON_EXTRACT(null, '$.k1');
    +----------------------------+
    | JSON_EXTRACT(null, '$.k1') |
    +----------------------------+
    | NULL |
    +----------------------------+
  2. <path> равен NULL

    SELECT JSON_EXTRACT('{"k1":"v31","k2":300}', NULL);
    +---------------------------------------------+
    | JSON_EXTRACT('{"k1":"v31","k2":300}', NULL) |
    +---------------------------------------------+
    | NULL |
    +---------------------------------------------+
  3. Многоуровневый путь

    SELECT JSON_EXTRACT('{"k1":"v31","k2":{"sub_key": 1234.56}}', '$.k2.sub_key');
    +------------------------------------------------------------------------+
    | JSON_EXTRACT('{"k1":"v31","k2":{"sub_key": 1234.56}}', '$.k2.sub_key') |
    +------------------------------------------------------------------------+
    | 1234.56 |
    +------------------------------------------------------------------------+
  4. Путь к элементу массива

    SELECT JSON_EXTRACT(json_array("abc", 123, cast(now() as string)), '$[2]');
    +----------------------------------------------------------------------+
    | JSON_EXTRACT(json_array("abc", 123, cast(now() as string)), '$[2]') |
    +----------------------------------------------------------------------+
    | "2025-07-16 18:35:25" |
    +----------------------------------------------------------------------+
  5. Несуществующий путь

    SELECT JSON_EXTRACT('{"k1":"v31","k2":300}', '$.k3');
    +-----------------------------------------------+
    | JSON_EXTRACT('{"k1":"v31","k2":300}', '$.k3') |
    +-----------------------------------------------+
    | NULL |
    +-----------------------------------------------+
  6. Несколько параметров пути

    select JSON_EXTRACT('{"id": 123, "name": "doris"}', '$.name', '$.id', '$.not_exists');
    +--------------------------------------------------------------------------------+
    | JSON_EXTRACT('{"id": 123, "name": "doris"}', '$.name', '$.id', '$.not_exists') |
    +--------------------------------------------------------------------------------+
    | ["doris",123] |
    +--------------------------------------------------------------------------------+

    Даже если найдено только одно совпадение, оно возвращается в виде массива

    SELECT json_extract('{"id": 123, "name": "doris"}', '$.aaa', '$.name');
    +-----------------------------------------------------------------+
    | json_extract('{"id": 123, "name": "doris"}', '$.aaa', '$.name') |
    +-----------------------------------------------------------------+
    | ["doris"] |
    +-----------------------------------------------------------------+

    Если ни для одного пути нет совпадений, возвращается NULL

    select JSON_EXTRACT('{"id": 123, "name": "doris"}', '$.k1', '$.k2', '$.not_exists');
    +------------------------------------------------------------------------------+
    | JSON_EXTRACT('{"id": 123, "name": "doris"}', '$.k1', '$.k2', '$.not_exists') |
    +------------------------------------------------------------------------------+
    | NULL |
    +------------------------------------------------------------------------------+
  7. Путь с подстановочным знаком

    select json_extract('{"k": [1,2,3,4,5]}', '$.k[*]');
    +----------------------------------------------+
    | json_extract('{"k": [1,2,3,4,5]}', '$.k[*]') |
    +----------------------------------------------+
    | [1,2,3,4,5] |
    +----------------------------------------------+
    select json_extract('{"k": [1,2,3,4,5], "k2": "abc", "k3": {"k4": "v4"}}', '$.*', '$.k3.k4');
    +---------------------------------------------------------------------------------------+
    | json_extract('{"k": [1,2,3,4,5], "k2": "abc", "k3": {"k4": "v4"}}', '$.*', '$.k3.k4') |
    +---------------------------------------------------------------------------------------+
    | [[1,2,3,4,5],"abc",{"k4":"v4"},"v4"] |
    +---------------------------------------------------------------------------------------+
  8. '**' в пути

    select json_extract('{"k": 123, "b": {"k": ["ab", "cd"]}}', '$**.k');
    +---------------------------------------------------------------+
    | json_extract('{"k": 123, "b": {"k": ["ab", "cd"]}}', '$**.k') |
    +---------------------------------------------------------------+
    | [123,["ab","cd"]] |
    +---------------------------------------------------------------+
  9. Значение равно NULL

    select JSON_EXTRACT('{"id": 123, "name": null}', '$.name') v, JSON_EXTRACT('{"id": 123, "name": null}', '$.name') is null v2;
    +------+------+
    | v | v2 |
    +------+------+
    | null | 0 |
    +------+------+
  10. Извлечение поля из каждого элемента массива JSON (Doris 4.0+)

    select json_extract('[{"k":1},{"k":2},{"k":3}]', '$.k');
    +--------------------------------------------------+
    | json_extract('[{"k":1},{"k":2},{"k":3}]', '$.k') |
    +--------------------------------------------------+
    | NULL |
    +--------------------------------------------------+

    $.k не обходит массивы; он обращается только к членам объекта.

    select json_extract('[{"k":1},{"k":2},{"k":3}]', '$[*].k');
    +-----------------------------------------------------+
    | json_extract('[{"k":1},{"k":2},{"k":3}]', '$[*].k') |
    +-----------------------------------------------------+
    | [1,2,3] |
    +-----------------------------------------------------+

    Используйте $[*].k, чтобы извлечь поле из каждого элемента массива.

Извлечение одного и того же поля из элементов массива (Doris 4.0 и новее)​

Используйте $[*].k1 для явного обхода элементов массива. $.k1 обращается только к членам объекта и не выполняет неявный обход массива, поэтому прямой путь в примере ниже возвращает SQL NULL. Элементы массива без k1 не включаются в результаты.

SELECT json_extract('[{"k1":"v1"},{"k2":"v2"},{"k1":"v3"},{"k1":"v4"}]', '$.k1') AS direct_path,
json_extract('[{"k1":"v1"},{"k2":"v2"},{"k1":"v3"},{"k1":"v4"}]', '$[*].k1') AS all_values;
+-------------+------------------+
| direct_path | all_values |
+-------------+------------------+
| NULL | ["v1","v3","v4"] |
+-------------+------------------+