MySQL JSON_CONTAINS()
函数检查一个 JSON 文档中是否包含另一个 JSON 文档。
JSON_CONTAINS(target_json, candidate_json)
JSON_CONTAINS(target_json, candidate_json, path)
如果在target_json
中包含candidate_json
,JSON_CONTAINS()
函数将返回 1
,否则返回 0
。如果提供了 path 参数,则检查由 path 匹配的部分是否包含candidate_json
如果存在以下的情况, JSON_CONTAINS() 函数将返回 NULL:
- 如果 JSON 文档中不存在指定的路径。
- 如果任意一个参数为 NULL。
JSON_CONTAINS() 函数将在以下情况下返回错误:
- 如果参数 json 不是有效的 JSON 文档,MySQL 将会给出错误。您可以使用
JSON_VALID()
验证 JSON 文档的有效性。- 如果参数 path 不是有效的路径表达式, MySQL 将会给出错误。
SELECT
JSON_CONTAINS('[1, 2, {"x": 3}]', '1') as `1`,
JSON_CONTAINS('[1, 2, {"x": 3}]', '{"x": 3}') as `{"x": 3}`,
JSON_CONTAINS('[1, 2, {"x": 3}]', '3') as `3`;
+------+----------+------+
| 1 | {"x": 3} | 3 |
+------+----------+------+
| 1 | 1 | 0 |
+------+----------+------+
SELECT
JSON_CONTAINS('[1, 2, [3, 4]]', '2'),
JSON_CONTAINS('[1, 2, [3, 4]]', '2', '$[2]');
+--------------------------------------+----------------------------------------------+
| JSON_CONTAINS('[1, 2, [3, 4]]', '2') | JSON_CONTAINS('[1, 2, [3, 4]]', '2', '$[2]') |
+--------------------------------------+----------------------------------------------+
| 1 | 0 |
+--------------------------------------+----------------------------------------------+
这里,我们已经在 JSON_CONTAINS('[1, 2, [3, 4]]', '2', '$[2]')
指定了路径表达式$[2]
,其匹配的内容是 [3, 4]
。 [3, 4]
中没有包含 2
, 因此,它返回了0
。
路径表达式:
$
代表整个json文档,$[2]
表示取数组下标为2的,其他用法跟js从json对象中取值类似,例如:$.name,$[0].name等等
用法上不难,却有个坑点,即:candidate_json
是json文档,即它必须是json文档格式。例如:
//错误写法
select Json_Contains('[1,2,3]',1);
select Json_Contains('["a","b","c"]','c');
这两个语句都是错误的,因为传递的candidate_json
不是json文档格式,json文档格式肯定是个字符串。
select Json_Contains('[1,2,3]','1');
select Json_Contains('["a","b","c"]','"c"');
在sql中添加''
很容易,但在Mybatis中就不好添加了,这里需要使用一个函数:JSON_QUOTE()
<select id="select">
select * from user where json_contains(teachers, JSON_QUOTE(#{teacherId}))
</select>