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路径(如'$[*]'),用于指定在目标文档中的具体路径($[*]表示数组中的每个元素)。
  • 返回值为
相关推荐
火山上的企鹅8 小时前
Codex实战:APP远程升级服务搭建(三)后台管理页面(APK 上传、版本管理、多应用页签)
服务器·网络·数据库·oracle·qgc
阿狸猿9 小时前
论 NoSQL 数据库技术及其应用
数据库·nosql
FBI HackerHarry浩9 小时前
DataGrip2023.2.3默认保存的数据库和.sql文件在哪里?怎么修改默认路径?
数据库
袁小皮皮不皮9 小时前
3.HCIP OSPF补充知识(优化版)
服务器·网络·数据库·网络协议·智能路由器
运筹vivo@9 小时前
Python ContextVar 底层机制与内存模型拆解
前端·数据库·python
志栋智能10 小时前
超自动化巡检:知识沉淀与团队协作的新载体
大数据·运维·网络·数据库·人工智能·自动化
syt_biancheng10 小时前
Redis初识
数据库·redis·缓存
cmes_love10 小时前
股票逐笔level2历史行情下载十档订单薄五档tick分钟下载分享
数据库·区块链
仙俊红10 小时前
SQL 调优需要掌握的知识
数据库·sql
fofantasy11 小时前
NSK LH12AN 微型导轨技术手册
运维·网络·数据库·经验分享·规格说明书