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 分钟前
AI掘金头条新闻系统 (Toutiao News)-用户注册-创建用户
后端·python·mysql·fastapi·web
l1t23 分钟前
Hy-MT2-1.8B总结的pgvector 0.8.2解决了并行HNSW索引构建漏洞
数据库·人工智能·postgresql
我是一颗柠檬34 分钟前
【MySQL全面教学】MySQL条件查询与排序Day4(2026年)
数据库·后端·mysql
丷丩35 分钟前
Postgresql基础实践教程(四)
数据库·postgresql
六月雨滴38 分钟前
RMAN 增量备份(Incremental Backup)
数据库·oracle
2401_8788204739 分钟前
Redis+Lua脚本实现全局令牌桶限流
数据库·redis·lua
Slow菜鸟1 小时前
Maven 仓库下载机制
java·数据库·maven
身如柳絮随风扬1 小时前
Redis 主从复制与哨兵机制详解:从原理到高可用实战
数据库·redis·缓存
冰小忆1 小时前
类变量在继承场景下的初始化规则是怎样的?
java·前端·数据库
YL200404261 小时前
MySQL-运维篇-主从复制
运维·数据库·mysql