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路径(如'$[*]'),用于指定在目标文档中的具体路径($[*]表示数组中的每个元素)。
  • 返回值为
相关推荐
brevity_souls1 小时前
SQL Server 窗口函数简介
开发语言·javascript·数据库
倚-天-照-海1 小时前
Doris数据库基本概念
数据库
翼龙云_cloud1 小时前
阿里云渠道商:cpu 弹性扩容有哪些限制条件?
数据库·阿里云·云计算
陈聪.2 小时前
HRCE简单实验
linux·运维·数据库
APIshop2 小时前
实战代码解析:item_get——获取某鱼商品详情接口
java·linux·数据库
洛_尘2 小时前
MySQL 5:增删改查操作
数据库·mysql
老邓计算机毕设2 小时前
SSM养老院老人健康信息管理系统t4p4x(程序+源码+数据库+调试部署+开发环境)带论文文档1万字以上,文末可获取,系统界面在最后面
数据库·计算机毕业设计·ssm 框架·养老院老人健康管理系统
AC赳赳老秦2 小时前
跨境科技服务的基石:DeepSeek赋能多语言技术文档与合规性说明的深度实践
android·大数据·数据库·人工智能·科技·deepseek·跨境
理智的煎蛋2 小时前
达梦数据库全流程操作指南
数据库·oracle
FreeBuf_2 小时前
欧盟漏洞数据库正式上线,采用去中心化模式运营
数据库·去中心化·区块链