mysql JSON_CONTAINS

JSON_CONTAINS 是 MySQL 等数据库中用于检查 JSON 文档是否包含特定值或对象的函数‌,返回 1(包含)或 0(不包含),支持路径参数精准定位。‌

基本语法与功能

JSON_CONTAINS 的核心功能是验证目标 JSON 文档(target)是否包含候选 JSON 值(candidate),可选路径参数(path)指定搜索位置。其规则包括:

  • 返回值‌:1 表示包含,0 表示不包含,NULL 表示参数无效或路径错误。‌
  • 数据类型匹配‌:数值类型直接比较;数组需所有元素匹配;对象需键值完全一致。‌
  • 错误处理 ‌:若 targetcandidate 非有效 JSON,或路径含通配符(如 *),会报错。‌

使用示例与场景

1‌.简单值检查‌:查询偏好主题为 "dark" 的用户:

SELECT name FROM users WHERE JSON_CONTAINS(preferences, '"dark"', '$.theme');

此例中,preferences 是 JSON 字段,"dark" 为搜索值,$.theme 指定路径。‌

  1. 嵌套对象匹配‌:检查 JSON 中是否包含完整对象:

SELECT name FROM users WHERE JSON_CONTAINS(preferences, '{"theme": "dark"}', '$.ui');

需确保 candidate 为有效 JSON 字符串。‌

  1. 多条件组合 ‌:结合 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');

结果 ‌:返回AliceBob,因为他们都包含"English"languages数组中。

2. 检查用户是否使用深色主题

SELECT name FROM users WHERE JSON_CONTAINS(preferences, '"dark"', '$.theme');

结果 ‌:返回AliceCharlie,因为他们都包含"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), '$[*]');

结果 ‌:返回AliceBob的订单,因为他们都包含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), '$[*]');

结果 ‌:返回AliceBob的订单,因为他们都包含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路径(如'$[*]'),用于指定在目标文档中的具体路径($[*]表示数组中的每个元素)。
  • 返回值为
相关推荐
devmoon10 小时前
在 Polkadot Runtime 中添加多个 Pallet 实例实战指南
java·开发语言·数据库·web3·区块链·波卡
认真的薛薛10 小时前
数据库-sql语句
数据库·sql·oracle
爱学英语的程序员10 小时前
面试官:你了解过哪些数据库?
java·数据库·spring boot·sql·mysql·mybatis
CSCN新手听安10 小时前
【linux】网络基础(三)TCP服务端网络版本计算器的优化,Json的使用,服务器守护进程化daemon,重谈OSI七层模型
linux·服务器·网络·c++·tcp/ip·json
·云扬·11 小时前
MySQL Redo Log落盘机制深度解析
数据库·mysql
用户9828630256811 小时前
pg内核实现细节
数据库
码界筑梦坊11 小时前
330-基于Python的社交媒体舆情监控系统
python·mysql·信息可视化·数据分析·django·毕业设计·echarts
bloglin9999911 小时前
Qwen3-32B报错Invalid json output:{“type“: “1“}For troubleshooting, visit
llm·json
飞升不如收破烂~11 小时前
Redis 分布式锁+接口幂等性使用+当下流行的限流方案「落地实操」+用户连续点击两下按钮的解决方案自用总结
数据库·redis·分布式
workflower11 小时前
业务需求-假设场景
java·数据库·测试用例·集成测试·需求分析·模块测试·软件需求