跳到主要内容

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}', 'one', 'Alice');
    +------------------------------------------------------------+
    | JSON_SEARCH('{"name": "John", "age": 30}', 'one', 'Alice') |
    +------------------------------------------------------------+
    | NULL |
    +------------------------------------------------------------+
  5. 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 |
    +-----------------------------------+
  6. 非法的 <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'