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.
示例
-
查找一个值(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}', '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'