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

JSON_SEARCH

Описание​

Функция JSON_SEARCH используется для поиска указанных значений в документе JSON. Если значение найдено, она возвращает путь к нему. Если значение не найдено, она возвращает NULL. Функция поддерживает рекурсивный поиск в структурах данных JSON.

Синтаксис​

JSON_SEARCH( <json_object>, <one_or_all>, <search_value> )

Параметры​

  • <json_object>: тип JSON, документ JSON, в котором выполняется поиск.
  • <one_or_all>: тип String, определяет, нужно ли искать все совпадающие значения. Допустимые значения: 'one' или 'all'.
  • <search_value>: тип String, значение, которое нужно найти. Поддерживает символы подстановки '%' (соответствует любому количеству произвольных символов) и '_' (соответствует любому одному символу).

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

Nullable(JSON): в зависимости от параметра <one_or_all> возможны два варианта:

  1. 'one': если найдено совпадающее значение, возвращает путь в JSON, указывающий на это значение. Если совпадающее значение не найдено, возвращает NULL.
  2. 'all': возвращает пути ко всем совпадающим значениям. Если значений несколько, возвращает пути в виде массива JSON. Если совпадения не найдены, возвращает 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'