Mysql 中 JSON_CONTAINS、JSON_ARRAY 的使用

本文介绍如何使用JSON_CONTAINS和JSON_ARRAY函数在数据库中精确查找包含特定关键词的数据,通过实例演示了如何构建JSON数组并进行有效查询。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

基本语法:https://www.cnblogs.com/ooo0/p/9309277.html

JSON_CONTAINS(json_doc, val[, path]) // 判断是否包含某个json值

JSON_ARRAY([val[, val] ...]) 创建json数组

1、用科大讯飞语音识别到的已经中文分词的文字,例:“我”“想”“销”“存单” 
2、根据上面语音识别出来的多个关键字,在数据表中查找出包含上述四个关键字中任意若干个数据。

表中数据大概这样: 

要从此表中匹配到包含上述四个关键字中的任意若干个,可这样:

SELECT * FROM nlu_define_table WHERE JSON_CONTAINS(JSON_ARRAY("","","","存单"),keywords->'$.keywords') ORDER BY weights DESC;

 

即可搜索到数据 

另附上部分sql,以防之后忘记

 

SELECT * FROM nlu_define_table;
SELECT * FROM nlu_define_table WHERE keywords LIKE "%销%";
SELECT * FROM nlu_define_table WHERE JSON_EXTRACT(keywords,'$.keywords') LIKE "%销%";
SELECT * FROM nlu_define_table WHERE keywords -> '$.keywords' LIKE "%销%";

其中第三条sql和第四条sql是等效的(但是如果是数字的话 就不行了 ,例如 里面有 1,11 这样的 , 匹配结果就不是正确的了)。。。

转自:https://blog.youkuaiyun.com/qq_35952946/article/details/79131488

 

转载于:https://www.cnblogs.com/cearnach/p/9940277.html

<think>我们正在讨论如何在SQL查询中将JSON_CONTAINS函数与OR条件结合使用。根据引用[1][3][4][5],JSON_CONTAINS用于检查JSON文档中是否包含特定值。结合OR条件,我们可以通过以下方式实现: ###方法1:使用多个`OR`连接条件在WHERE子句中直接使用多个`OR`连接多个JSON_CONTAINS条件: ```sqlSELECT *FROMtable_nameWHEREJSON_CONTAINS(json_column, 'value1', '$.path') ORJSON_CONTAINS(json_column,'value2','$.path')OR...;```###方法2:使用`JSON_CONTAINS`与`IN`运算符(但需注意JSON_CONTAINS不支持直接IN列表) 由于JSON_CONTAINS一次只能检查一个值,我们可以使用多个OR条件。但若想简化,可考虑构建JSON数组并使用JSON_CONTAINS检查数组中任意元素是否存在(但这取决于数据结构)。###方法3:使用`UNION`(当OR条件导致性能问题时) 如果OR条件过多可能导致性能下降,可以拆分为多个查询再用UNION合并:```sqlSELECT* FROMtable_nameWHERE JSON_CONTAINS(json_column,'value1','$.path')UNIONSELECT* FROMtable_nameWHERE JSON_CONTAINS(json_column,'value2','$.path');``` ###示例场景假设有表`products`,其中`attributes`是JSON列,存储产品属性。我们想查询属性包含"waterproof"或"shockproof"的产品:```sqlSELECT* FROMproductsWHEREJSON_CONTAINS(attributes,'"waterproof"', '$.features') ORJSON_CONTAINS(attributes, '"shockproof"', '$.features'); ```###注意事项1.**路径参数**:第三个参数是JSON路径(如`'$.features'`),若检查整个文档可省略(如引用[3]中的用法)。 2. **值必须为JSON格式**:第二个参数必须是有效的JSON值(如字符串需加双引号:`'"value"'`)。 3. **性能**:JSON_CONTAINS可能无法有效利用索引,在大数据量时需考虑优化(如使用生成列加索引)。###引用说明-使用`JSON_CONTAINS`检查JSON数组是否包含特定值(如引用[3])[^3]。 -结合`OR`条件循环拼接多个`JSON_CONTAINS`条件(如引用[1]中Java代码的SQL等效写法)[^1]。 §§相关问题§§1.如何为JSON列创建索引以提高`JSON_CONTAINS`的查询性能? 2. `JSON_CONTAINS`和`JSON_SEARCH`有什么区别? 3.在MySQL中,如何查询JSON数组包含多个值(AND条件)?</think>### 在 SQL 查询中结合使用 JSON_CONTAINS 和 OR 条件 在 MySQL 中结合使用 `JSON_CONTAINS` 和 `OR` 条件进行 JSON 数据查询时,主要有以下两种实现方式: #### 方法 1:直接使用多个 OR 条件(推荐) ```sql SELECT * FROM your_table WHERE JSON_CONTAINS(json_column, '"value1"', '$.path') OR JSON_CONTAINS(json_column, '"value2"', '$.path') OR JSON_CONTAINS(json_column, '"value3"', '$.path'); ``` **关键说明:** 1. **值格式**:查询值必须用双引号包裹(`'"value1"'`),表示 JSON 字符串 2. **路径参数**:`'$.path'` 指定 JSON 中的查找路径(可省略,表示根路径) 3. **OR 连接**:每个 `JSON_CONTAINS` 条件用 `OR` 连接,实现"任意匹配一个即返回" 示例(查询 member 表中 info 字段包含 ID 4 或 5 的记录): ```sql SELECT * FROM member WHERE JSON_CONTAINS(info, '"4"') OR JSON_CONTAINS(info, '"5"'); ``` #### 方法 2:使用 JSON_ARRAY 结合 OR ```sql SELECT * FROM your_table WHERE JSON_CONTAINS(json_column, JSON_ARRAY('value1', 'value2'), '$.path') > 0; ``` **适用场景:** - 当需要检查 JSON 数组是否包含 **多个指定值中的任意一个** 时 - 返回值 1 表示包含,0 表示不包含(需用 `> 0` 判断) #### 注意事项 1. **数据类型匹配**:`JSON_CONTAINS` 严格匹配数据类型,字符串 `"4"` 和数字 `4` 不同 2. **路径语法**:使用 `'$.key.subkey'` 访问嵌套结构 3. **性能优化**:对 JSON使用生成列+索引可提升查询效率 4. **空值处理**:`JSON_CONTAINS(NULL, ...)` 返回 NULL,建议配合 `COALESCE` > 引用说明:通过 `OR` 连接多个 `JSON_CONTAINS` 条件可实现灵活查询(如引用[1]的 Java 实现原理)[^1],同时需注意 JSON 值的正确格式(如引用[3][4]的示例)[^3][^4]。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值