MySQL JSON_CONTAINS() 传递参数

一、JSON_CONTAINS 用法

MySQL JSON_CONTAINS() 函数检查一个 JSON 文档中是否包含另一个 JSON 文档。

  • 语法
JSON_CONTAINS(target_json, candidate_json)
JSON_CONTAINS(target_json, candidate_json, path)
  • 参数
  1. target_json:必需的。一个 JSON 文档。
  2. candidate_json:必需的。被包含的 JSON 文档
  3. path: 可选的。一个路径表达式。
  • 返回值

如果在target_json 中包含candidate_jsonJSON_CONTAINS() 函数将返回 1,否则返回 0。如果提供了 path 参数,则检查由 path 匹配的部分是否包含candidate_json

如果存在以下的情况, JSON_CONTAINS() 函数将返回 NULL:

  • 如果 JSON 文档中不存在指定的路径。
  • 如果任意一个参数为 NULL。

JSON_CONTAINS() 函数将在以下情况下返回错误:

  • 如果参数 json 不是有效的 JSON 文档,MySQL 将会给出错误。您可以使用JSON_VALID()验证 JSON 文档的有效性。
  • 如果参数 path 不是有效的路径表达式, MySQL 将会给出错误。

二、示例

1. 数组

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 |
+------+----------+------+

2. 指定路径

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"');

四、Mybatis中使用

在sql中添加''很容易,但在Mybatis中就不好添加了,这里需要使用一个函数:JSON_QUOTE()

<select id="select">
select * from user where json_contains(teachers, JSON_QUOTE(#{teacherId}))
select>

你可能感兴趣的:(mysql,json_contains)