Последнее обновление
JSON_SEARCH
Описание
Функция JSON_SEARCH ищет указанные значения в документе JSON. Если значение найдено, функция возвращает путь к нему. Если значение не найдено, возвращается NULL. Функция поддерживает рекурсивный поиск в структурах данных JSON.
Синтаксис
JSON_SEARCH( <json_object>, <one_or_all>, <search_value> )
Параметры
<json_object>: тип JSON; документ JSON, в котором выполняется поиск.<one_or_all>: строковый тип; определяет, нужно ли искать все совпадающие значения. Допустимые значения: 'one' и 'all'.<search_value>: строковый тип; искомое значение. Поддерживаются подстановочные символы '%' (соответствует любому количеству любых символов) и '_' (соответствует любому одному символу).
Возвращаемое значение
Nullable(JSON): в зависимости от параметра <one_or_all> возможны два случая:
1. 'one': If a matching value is found, returns a JSON path pointing to the matching value. If no matching value is found, returns NULL.
2. 'all': Returns paths to all matching values. If there are multiple values, returns them as a JSON array. If no matches are found, returns NULL.
Примечания
- Параметр
one_or_allопределяет, нужно ли искать все совпадающие значения. Значение 'one' возвращает первый найденный путь, а 'all' возвращает все найденные пути. При любом другом значении возникает ошибка. - Если совпадающее значение не найдено, функция возвращает NULL.
- Если хотя бы один из параметров
<json_object>,<one_or_all>,<search_value>равен NULL, возвращается NULL.
Примеры
-
Поиск одного значения (one)
SELECT JSON_SEARCH('{"name": "John", "age": 30}', 'one', 'John');+-----------------------------------------------------------+
| JSON_SEARCH('{"name": "John", "age": 30}', 'one', 'John') |
+-----------------------------------------------------------+
| "$.name" |
+-----------------------------------------------------------+ -
Поиск одного значения (one): даже при нескольких совпадениях возвращается только один путь
SELECT JSON_SEARCH('{"name": "John", "age": 30, "alias": "John"}', 'one', 'John');+----------------------------------------------------------------------------+
| JSON_SEARCH('{"name": "John", "age": 30, "alias": "John"}', 'one', 'John') |
+----------------------------------------------------------------------------+
| "$.name" |
+----------------------------------------------------------------------------+ -
Поиск всех совпадающих значений (all)
SELECT JSON_SEARCH('{"name": "John", "age": 30, "alias": "John"}', 'all', 'John');+----------------------------------------------------------------------------+
| JSON_SEARCH('{"name": "John", "age": 30, "alias": "John"}', 'all', 'John') |
+----------------------------------------------------------------------------+
| ["$.alias","$.name"] |
+----------------------------------------------------------------------------+ -
'%' в качестве подстановочного символа
SELECT JSON_SEARCH('{"name": "John", "age": 30, "alias": "John"}', 'all', '%');+-------------------------------------------------------------------------+
| JSON_SEARCH('{"name": "John", "age": 30, "alias": "John"}', 'all', '%') |
+-------------------------------------------------------------------------+
| ["$.alias","$.name"] |
+-------------------------------------------------------------------------+ -
'_' в качестве подстановочного символа
SELECT JSON_SEARCH('{"name": "John", "age": 30, "alias": "Jihn"}', 'all', 'J_hn');+----------------------------------------------------------------------------+
| JSON_SEARCH('{"name": "John", "age": 30, "alias": "Jihn"}', 'all', 'J_hn') |
+----------------------------------------------------------------------------+
| ["$.alias","$.name"] |
+----------------------------------------------------------------------------+ -
Экранирование подстановочного символа
SELECT JSON_SEARCH('{"name": "John", "age": 30, "alias": "J_hn"}', 'all', 'J\_hn');+-----------------------------------------------------------------------------+
| JSON_SEARCH('{"name": "John", "age": 30, "alias": "J_hn"}', 'all', 'J\_hn') |
+-----------------------------------------------------------------------------+
| "$.alias" |
+-----------------------------------------------------------------------------+'J_hn' соответствует только "J_hn" и не соответствует "John".
-
Совпадающее значение не найдено
SELECT JSON_SEARCH('{"name": "John", "age": 30}', 'one', 'Alice');+------------------------------------------------------------+
| JSON_SEARCH('{"name": "John", "age": 30}', 'one', 'Alice') |
+------------------------------------------------------------+
| NULL |
+------------------------------------------------------------+ -
Параметры со значением NULL
SELECT JSON_SEARCH('{"name": "John", "age": 30}', NULL, 'Alice');+-----------------------------------------------------------+
| JSON_SEARCH('{"name": "John", "age": 30}', NULL, 'Alice') |
+-----------------------------------------------------------+
| NULL |
+-----------------------------------------------------------+SELECT JSON_SEARCH('{"name": "John", "age": 30}', 'one', NULL);+---------------------------------------------------------+
| JSON_SEARCH('{"name": "John", "age": 30}', 'one', NULL) |
+---------------------------------------------------------+
| NULL |
+---------------------------------------------------------+SELECT JSON_SEARCH(NULL, 'one', 'Alice');+-----------------------------------+
| JSON_SEARCH(NULL, 'one', 'Alice') |
+-----------------------------------+
| NULL |
+-----------------------------------+ -
Недопустимое значение параметра
<one_or_all>SELECT JSON_SEARCH('{"name": "John", "age": 30}', 'three', 'Alice');ERROR 1105 (HY000): errCode = 2, detailMessage = [INVALID_ARGUMENT]the one_or_all argument three is not 'one' not 'all'