MySQL中的JSON_CONTAINS函数用法
MySQL中的JSON_CONTAINS
函数用于检查一个JSON文档(目标)是否包含另一个JSON文档(搜索值)。以下是其详细用法:
函数语法
JSON_CONTAINS(target_json, search_json [, path])
- target_json:要检查的目标JSON文档。
- search_json:要搜索的JSON值或结构。
- path(可选):指定在目标JSON中的具体路径。若未指定,默认检查整个文档。
返回值:
1
:目标包含搜索值。0
:目标不包含搜索值。NULL
:参数为NULL
或路径不存在。
使用场景和示例
1. 检查数组是否包含元素
-
示例表:
CREATE TABLE users (id INT PRIMARY KEY,tags JSON ); INSERT INTO users VALUES (1, '["mysql", "database", "developer"]'), (2, '["python", "web", "tester"]'), (3, '["java", "backend", "developer"]');
-
查询包含
"developer"
标签的用户:SELECT * FROM users WHERE JSON_CONTAINS(tags, '"developer"', '$');
或简写:
SELECT * FROM users WHERE JSON_CONTAINS(tags, '"developer"');
注意:字符串需用双引号包裹,外层用单引号。
2. 检查对象是否包含键值对
-
示例数据:
{"name": "Alice", "age": 30, "skills": ["SQL", "Java"]}
-
查询包含
"name": "Alice"
的对象:SELECT * FROM profiles WHERE JSON_CONTAINS(data, '{"name": "Alice"}');
3. 嵌套结构和路径参数
-
示例数据:
{"department": {"team": ["Alice", "Bob"], "id": 101}}
-
**检查
team
数组是否包含"Bob"
**:SELECT JSON_CONTAINS('{"department": {"team": ["Alice", "Bob"], "id": 101}}','"Bob"','$.department.team' ); -- 返回1
4. 数据类型严格匹配
JSON区分数据类型,如数字3
和字符串"3"
不匹配:
SELECT JSON_CONTAINS('[1, 2, 3]', '3'); -- 返回1(数值3)
SELECT JSON_CONTAINS('[1, 2, "3"]', '"3"'); -- 返回1(字符串"3")
SELECT JSON_CONTAINS('[1, 2, 3]', '"3"'); -- 返回0(类型不匹配)
5. 通配符路径
-
示例数据:
{"employees": [{"name": "Alice"}, {"name": "Bob"}]}
-
**检查任意
name
是否为"Bob"
**:SELECT JSON_CONTAINS('{"employees": [{"name": "Alice"}, {"name": "Bob"}]}','"Bob"','$.employees[*].name' ); -- 返回1
注意事项
-
路径存在性:若路径不存在,返回
NULL
。SELECT JSON_CONTAINS('{"a": 1}', '1', '$.b'); -- 返回NULL
-
对象匹配:搜索对象时,必须完全包含所有键值对。
SELECT JSON_CONTAINS('{"a":1, "b":2}', '{"a":1}'); -- 返回1 SELECT JSON_CONTAINS('{"a":1}', '{"a":1, "b":2}'); -- 返回0
-
数组子集:搜索数组时,目标数组需包含搜索数组所有元素(顺序无关)。
SELECT JSON_CONTAINS('[1,2,3]', '[3,1]'); -- 返回1 SELECT JSON_CONTAINS('[1,2,3]', '[1,4]'); -- 返回0
总结
JSON_CONTAINS
适用于验证JSON结构中的存在性,需注意:
- 正确使用路径和数据类型。
- 对象需完全匹配键值对,数组需包含所有元素。
- 结合路径通配符(
*
)可灵活处理嵌套数据。