MySQL JSON_CONTAINS() 传递参数
2023-12-28 19:31:04
一、JSON_CONTAINS 用法
MySQL JSON_CONTAINS()
函数检查一个 JSON 文档中是否包含另一个 JSON 文档。
JSON_CONTAINS(target_json, candidate_json)
JSON_CONTAINS(target_json, candidate_json, path)
- target_json:必需的。一个 JSON 文档。
- candidate_json:必需的。被包含的 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 将会给出错误。
二、示例
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>
文章来源:https://blog.csdn.net/suo082407128/article/details/135274173
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。 如若内容造成侵权/违法违规/事实不符,请联系我的编程经验分享网邮箱:veading@qq.com进行投诉反馈,一经查实,立即删除!
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。 如若内容造成侵权/违法违规/事实不符,请联系我的编程经验分享网邮箱:veading@qq.com进行投诉反馈,一经查实,立即删除!