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路径(如'$[*]'),用于指定在目标文档中的具体路径($[*]表示数组中的每个元素)。
  • 返回值为
相关推荐
码农小卡拉12 小时前
深入解析Spring Boot文件加载顺序与加载方式
java·数据库·spring boot
怣5012 小时前
MySQL多表连接:全外连接、交叉连接与结果集合并详解
数据库·sql
wjhx12 小时前
QT中对蓝牙权限的申请,整理一下
java·数据库·qt
冰暮流星12 小时前
javascript之二重循环练习
开发语言·javascript·数据库
万岳科技系统开发13 小时前
食堂采购系统源码库存扣减算法与并发控制实现详解
java·前端·数据库·算法
冉冰学姐13 小时前
SSM智慧社区管理系统jby69(程序+源码+数据库+调试部署+开发环境)带论文文档1万字以上,文末可获取,系统界面在最后面
数据库·管理系统·智慧社区·ssm 框架
杨超越luckly13 小时前
HTML应用指南:利用GET请求获取中国500强企业名单,揭秘企业增长、分化与转型的新常态
前端·数据库·html·可视化·中国500强
斯普信专业组13 小时前
构建基于MCP的MySQL智能运维平台:从开源服务端到交互式AI助手
运维·mysql·开源·mcp
Elastic 中国社区官方博客13 小时前
Elasticsearch:Workflows 介绍 - 9.3
大数据·数据库·人工智能·elasticsearch·ai·全文检索
仍然.13 小时前
MYSQL--- 聚合查询,分组查询和联合查询
数据库