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

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.

Примеры​

  1. Поиск одного значения (one)

    SELECT JSON_SEARCH('{"name": "John", "age": 30}', 'one', 'John');
    +-----------------------------------------------------------+
    | JSON_SEARCH('{"name": "John", "age": 30}', 'one', 'John') |
    +-----------------------------------------------------------+
    | "$.name" |
    +-----------------------------------------------------------+

  2. Поиск одного значения (one): даже при нескольких совпадениях возвращается только один путь

    SELECT JSON_SEARCH('{"name": "John", "age": 30, "alias": "John"}', 'one', 'John');
    +----------------------------------------------------------------------------+
    | JSON_SEARCH('{"name": "John", "age": 30, "alias": "John"}', 'one', 'John') |
    +----------------------------------------------------------------------------+
    | "$.name" |
    +----------------------------------------------------------------------------+
  3. Поиск всех совпадающих значений (all)

    SELECT JSON_SEARCH('{"name": "John", "age": 30, "alias": "John"}', 'all', 'John');
    +----------------------------------------------------------------------------+
    | JSON_SEARCH('{"name": "John", "age": 30, "alias": "John"}', 'all', 'John') |
    +----------------------------------------------------------------------------+
    | ["$.alias","$.name"] |
    +----------------------------------------------------------------------------+
  4. '%' в качестве подстановочного символа

    SELECT JSON_SEARCH('{"name": "John", "age": 30, "alias": "John"}', 'all', '%');
    +-------------------------------------------------------------------------+
    | JSON_SEARCH('{"name": "John", "age": 30, "alias": "John"}', 'all', '%') |
    +-------------------------------------------------------------------------+
    | ["$.alias","$.name"] |
    +-------------------------------------------------------------------------+
  5. '_' в качестве подстановочного символа

    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"] |
    +----------------------------------------------------------------------------+
  6. Экранирование подстановочного символа

    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".

  7. Совпадающее значение не найдено

    SELECT JSON_SEARCH('{"name": "John", "age": 30}', 'one', 'Alice');
    +------------------------------------------------------------+
    | JSON_SEARCH('{"name": "John", "age": 30}', 'one', 'Alice') |
    +------------------------------------------------------------+
    | NULL |
    +------------------------------------------------------------+
  8. Параметры со значением 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 |
    +-----------------------------------+
  9. Недопустимое значение параметра <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'