JSON_CONTAINS 是 MySQL 等数据库中用于检查 JSON 文档是否包含特定值或对象的函数,返回 1(包含)或 0(不包含),支持路径参数精准定位。
基本语法与功能
JSON_CONTAINS 的核心功能是验证目标 JSON 文档(target)是否包含候选 JSON 值(candidate),可选路径参数(path)指定搜索位置。其规则包括:
- 返回值:1 表示包含,0 表示不包含,NULL 表示参数无效或路径错误。
- 数据类型匹配:数值类型直接比较;数组需所有元素匹配;对象需键值完全一致。
- 错误处理 :若
target或candidate非有效 JSON,或路径含通配符(如*),会报错。
使用示例与场景
1.简单值检查:查询偏好主题为 "dark" 的用户:
SELECT name FROM users WHERE JSON_CONTAINS(preferences, '"dark"', '$.theme');
此例中,preferences 是 JSON 字段,"dark" 为搜索值,$.theme 指定路径。
- 嵌套对象匹配:检查 JSON 中是否包含完整对象:
SELECT name FROM users WHERE JSON_CONTAINS(preferences, '{"theme": "dark"}', '$.ui');
需确保 candidate 为有效 JSON 字符串。
- 多条件组合 :结合
AND实现复杂过滤,如同时匹配主题和通知状态:
SELECT name FROM users WHERE JSON_CONTAINS(preferences, '"dark"', '$.ui.theme') AND JSON_CONTAINS(preferences, 'true', '$.notifications');
简单示例场景
假设我们有一个名为users的表,其中包含用户信息,其中preferences列以JSON格式存储用户的偏好设置(如语言、主题等)。表结构如下:
CREATE TABLE users ( id INT AUTO_INCREMENT PRIMARY KEY, name VARCHAR(100), preferences JSON );
插入一些示例数据:
INSERT INTO users (name, preferences) VALUES ('Alice', '{"languages": ["English", "French"], "theme": "dark"}'), ('Bob', '{"languages": ["English"], "theme": "light"}'), ('Charlie', '{"languages": ["Spanish", "French"], "theme": "dark"}');
示例查询
1. 检查用户是否喜欢英语
SELECT name FROM users WHERE JSON_CONTAINS(preferences, '"English"', '$.languages');
结果 :返回Alice和Bob,因为他们都包含"English"在languages数组中。
2. 检查用户是否使用深色主题
SELECT name FROM users WHERE JSON_CONTAINS(preferences, '"dark"', '$.theme');
结果 :返回Alice和Charlie,因为他们都包含"dark"在theme字段中。
3. 检查用户是否同时喜欢英语和法语
SELECT name FROM users WHERE JSON_CONTAINS(preferences, '["English", "French"]', '$.languages');
结果 :返回Alice,因为她同时包含"English"和"French"在languages数组中。
4. 检查用户是否包含特定技能(假设details列存储技能)
SELECT name FROM employees WHERE JSON_CONTAINS(details->'$.skills', '"SQL"');
结果 :返回John Doe,因为他包含"SQL"在skills数组中。
复杂示例场景
假设我们有一个名为orders的表,其中包含订单信息,其中items列以JSON格式存储订单商品详情(如商品ID、数量、价格等)。表结构如下:
CREATE TABLE orders ( order_id INT AUTO_INCREMENT PRIMARY KEY, customer_name VARCHAR(100), items JSON );
插入一些示例数据:
INSERT INTO orders (customer_name, items) VALUES ('Alice', '[{"product_id": 100, "quantity": 2, "price": 19.99}, {"product_id": 200, "quantity": 1, "price": 9.99}]'), ('Bob', '[{"product_id": 100, "quantity": 1, "price": 19.99}]'), ('Charlie', '[{"product_id": 300, "quantity": 3, "price": 14.99}, {"product_id": 100, "quantity": 2, "price": 19.99}]');
查询示例
1. 检查订单中是否包含特定商品ID
SELECT order_id, customer_name FROM orders WHERE JSON_CONTAINS(items, JSON_OBJECT('product_id', 100), '$[*]');
结果 :返回Alice和Bob的订单,因为他们都包含product_id为100的商品。
2. 检查订单中是否包含特定商品ID且数量大于1
SELECT order_id, customer_name FROM orders WHERE JSON_CONTAINS(items, JSON_OBJECT('product_id', 100, 'quantity', 2), '$[*]');
结果 :返回Alice的订单,因为她包含product_id为100且quantity为2的商品。
3. 检查订单中是否包含特定商品ID且价格大于15
SELECT order_id, customer_name FROM orders WHERE JSON_CONTAINS(items, JSON_OBJECT('product_id', 100, 'price', 15), '$[*]');
结果 :返回Alice和Bob的订单,因为他们都包含product_id为100且price大于15的商品。
4. 检查订单中是否包含特定商品ID且数量大于1且价格大于15
SELECT order_id, customer_name FROM orders WHERE JSON_CONTAINS(items, JSON_OBJECT('product_id', 100, 'quantity', 2, 'price', 15), '$[*]');
结果 :返回Alice的订单,因为她包含product_id为100、quantity为2且price大于15的商品。
关键说明
JSON_CONTAINS函数用于检查JSON文档是否包含指定的值或对象。- 第一个参数是目标JSON文档(如
items)。 - 第二个参数是要查找的JSON对象(如
JSON_OBJECT('product_id', 100, 'quantity', 2))。 - 第三个参数是JSON路径(如
'$[*]'),用于指定在目标文档中的具体路径($[*]表示数组中的每个元素)。 - 返回值为