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]и так далее.
- Чтобы получить последний элемент json_array, можно использовать
*обозначает подстановочный знак:$.*обозначает все члены корневого объекта, а$[*]обозначает все элементы массива.**используется в сочетании с '**' обозначает все пути (включая вложенные пути любой глубины).
- Если
<path>содержит подстановочные знаки (*), найденные результаты возвращаются в виде массива. <path>не применяется автоматически к каждому элементу массива. Если<json_object>является массивом JSON, а<path>равен$.k, результат равен NULL:$.kобращается только к членам объекта. Чтобы обратиться к элементу по индексу, используйте$[i].k; чтобы извлечь поле из каждого элемента массива, используйте синтаксис с подстановочным знаком$[*].k, который поддерживается начиная с Doris 4.0.
Примеры
- Обычные параметры
SELECT JSON_EXTRACT('{"k1":"v31","k2":300}', '$.k1');
+-----------------------------------------------+
| JSON_EXTRACT('{"k1":"v31","k2":300}', '$.k1') |
+-----------------------------------------------+
| "v31" |
+-----------------------------------------------+
Примечание: результат возвращается в виде
"v31", а неv31.
-
Параметры со значением NULL
select JSON_EXTRACT(null, '$.k1');+----------------------------+
| JSON_EXTRACT(null, '$.k1') |
+----------------------------+
| NULL |
+----------------------------+ -
<path>равен NULLSELECT JSON_EXTRACT('{"k1":"v31","k2":300}', NULL);+---------------------------------------------+
| JSON_EXTRACT('{"k1":"v31","k2":300}', NULL) |
+---------------------------------------------+
| NULL |
+---------------------------------------------+ -
Многоуровневый путь
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 |
+------------------------------------------------------------------------+ -
Путь к элементу массива
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" |
+----------------------------------------------------------------------+ -
Несуществующий путь
SELECT JSON_EXTRACT('{"k1":"v31","k2":300}', '$.k3');+-----------------------------------------------+
| JSON_EXTRACT('{"k1":"v31","k2":300}', '$.k3') |
+-----------------------------------------------+
| NULL |
+-----------------------------------------------+ -
Несколько параметров пути
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 |
+------------------------------------------------------------------------------+ -
Путь с подстановочным знаком
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"] |
+---------------------------------------------------------------------------------------+ -
'**' в пути
select json_extract('{"k": 123, "b": {"k": ["ab", "cd"]}}', '$**.k');+---------------------------------------------------------------+
| json_extract('{"k": 123, "b": {"k": ["ab", "cd"]}}', '$**.k') |
+---------------------------------------------------------------+
| [123,["ab","cd"]] |
+---------------------------------------------------------------+ -
Значение равно NULL
select JSON_EXTRACT('{"id": 123, "name": null}', '$.name') v, JSON_EXTRACT('{"id": 123, "name": null}', '$.name') is null v2;+------+------+
| v | v2 |
+------+------+
| null | 0 |
+------+------+ -
Извлечение поля из каждого элемента массива 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"] |
+-------------+------------------+