MySQL查询JSON数组字段包含特定字符串的方法

2025-06-30 17:50

本文主要是介绍MySQL查询JSON数组字段包含特定字符串的方法,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

《MySQL查询JSON数组字段包含特定字符串的方法》在MySQL数据库中,当某个字段存储的是JSON数组,需要查询数组中包含特定字符串的记录时传统的LIKE语句无法直接使用,下面小编就为大家介绍两种...

问题背景

mysql数据库中,当某个字段存储的是jsON数组(如["喷绘","2.6m喷绘","M喷绘","直喷","双透","气模"]),需要查询数组中包含特定字符串(如’气模’)的记录时,传统的LIKE语句无法直接使用。本文介绍两种高效的解决方案。

解决方案对比

1. 精确匹配方案(推荐)

当需要完全匹配数组中的元素时(如精确查找"气模"):

SELECT *
FROM process_unit_prices
WHERE 
  process_name = '制图' 
  AND JSON_CONTAINS(craft_name, JSON_QUOTE('气模'))
LIMIT 1;

1.核心函数

  • JSON_QUOTE(): 将字符串转为JSON格式(如"气模"
  • JSON_CONTAINS(): 检查JSON数组中是否包含指定值

2.优点:效率高,精确匹配数组元素

3.注意:必须元素完全相等才会匹配(如"气模车"不会匹配)

2. 模糊匹配方案

当需要部分匹配元素内容时(如查找包含"气模"子串的元素):

SELECT *
FROM process_unit_prices
WHERE 
  process_name = '制图' 
  AND JSON_SEARCH(craft_name, 'one', '%气模%') IS NOT NULL
LIMIT 1;

1.核心函数

  • JSON_SEARCH(): 搜索JSON中匹配模式的路径
  • 'one': 找到第一个匹配即停止
  • '%气模%': SQL的LIKE通配符模式

2.优点:支持模糊匹配

3.注意:效率低于精确匹配,大数据量时需谨慎

参数化查询示例

在MyBATis等ORM框架中使用(如Spring Boot项目):

<!-- 精确匹配 -->
<select id="findProcess" resultType="Proceswww.chinasem.cnsPrice">
  SELECT * FROM process_unit_prices
  WHERE process_name = #{processType}
    AND JSON_CONTAINS(craft_name, JSON_QUOTE(#{craft}))
  LIMIT 1
</select>

<!-- 模糊匹配 -->
<select id="findProcessFuzzy" resultType="ProcessPrice">
  SELECT * FROM process_unit_prices
  WHERE process_name = #{processType}
    AND JSON_SEARCH(craft_name, 'one', CONCAT('%', #{craft}, '%')) IS NOT NULL
  LIMIT 1
</select&China编程gt;

使用场景建议

场景推荐方案示例
分类标签匹配精确匹配工艺类型=[“雕刻”,“喷涂”]
关键字搜索模糊匹配描述包含"紧急"的订单
多值属性过滤精确匹配颜色=[“红”,“蓝”]

性能优化贴士

索引优化:MySQL 8.0+可为JSON字段创建函数索引

CREATE INDEX idx_craft ON process_unit_prices((CAST(craft_name AS CHAR(255))));

数据规范:若常需查询,建议拆分为关系表

避免全模糊%气模%无法使用索引,尽量用气模%

经验总结:JSON字段查询虽灵活,但需谨慎使用。精确匹配首选JSON_CONTAINS,模糊需求再用JSON_SEARCH,并注意性能影响。在数据设计阶段评估是否真需JSON结构,关系表通常更高效。

知识扩展

下面小编为大家整理了MYSQL 匹配查询JSON字段的相关方法,希望对大家有所帮助

在 MySQL 中,如果你存储的是 JSON 数据,并且需要检查某个 JSON 字段是否包含一个特定的键值对(例如 {user1: 1}),你可以使用 MySQL 提供的 JSON 函数来实现。

1. 使用 JSON_CONTAINS() 函数

JSON_CONTAINS() 函数可以检查一个 JSON 字段是否包含另一个 JSON 值。该函数返回一个布尔值,如果第一个参数(JSON 数据)包含第二个参数(查询条件),则返回 1,否则返回 0

示例查询:

假设你的表结构如下:

CREATE TABLE users (
    id INT AUTO_INCREMENT PRIMARY KEY,
    user_data JSON
);

你可以通过 JSON_CONTAINS() 函数来检查 JSON 字段是否包含 {user1: 1}

SEL编程China编程ECT * 
FROM users 
WHERE JSON_CONTAINS(user_data, '{"user1": 1}');

这条 SQL 语句会返回所有 user_data 字段包含 {user1: 1} 键值对的记录。

2. JSON_CONTAINS() 函数的使用细节

  • 第一个参数是你要查询的 JSON 字段。
  • 第二个参数是你要查找的 JSON 数据,必须是一个有效的 JSON 格式字符串。
  • 该函数会检查 JSON 字段中是否存在第二个参数所表示的键值对。

3. 查询部分匹配

如果你只想检查 JSON 字段中是否存在某个键(例如 user1)并且该键的值是 1,而不关心 JSON 字段中的其他内容,你仍然可以使用 JSON_CONTAINS(),但是需要确保第二个参数符合你想要的结构。

SELECT javascript* 
FROM users 
WHERE JSON_CONTAINS(user_data, '{"user1": 1}');

4. 检查 JSON 字段中是否包含某个键

如果你不关心键值对,只想检查 JSON 字段中是否包含某个键(比如 user1),可以使用 JSON_EXTRACT() 或 JSON_UNQUOTE() 与 IS NOT NULL 来实现。

SELECT * 
FROM users 
WHERE JSON_UNQUOTE(JSON_EXTRACT(user_d编程ata, '$.user1')) = '1';
  • JSON_EXTRACT(user_data, '$.user1') 提取 user_data 字段中的 user1 键的值。
  • JSON_UNQUOTE() 去除引号,使其返回一个普通值。
  • 比较提取的值是否等于 '1'

小结

  • JSON_CONTAINS():用于检查 JSON 字段是否包含某个指定的键值对。
  • JSON_EXTRACT() + JSON_UNQUOTE():可以用来提取并比较 JSON 字段中的值。

使用 JSON_CONTAINS() 是检查 JSON 数据是否包含某个完整键值对的简便方法。如果你需要更细粒度的查询(如只关心键是否存在且其值为特定值),可以结合 JSON_EXTRACT() 和 JSON_UNQUOTE() 进行操作。

到此这篇关于MySQL查询JSON数组字段包含特定字符串的方法的文章就介绍到这了,更多相关MySQL查询JSON字段内容请搜索China编程(www.chinasem.cn)以前的文章或继续浏览下面的相关文章希望大家以后多多支持China编程(www.chinasem.cn)!

这篇关于MySQL查询JSON数组字段包含特定字符串的方法的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/1155264

相关文章

Linux查询服务器系统版本号的多种方法

《Linux查询服务器系统版本号的多种方法》在Linux系统管理和维护工作中,了解当前操作系统的版本信息是最基础也是最重要的操作之一,系统版本不仅关系到软件兼容性、安全更新策略,还直接影响到故障排查和... 目录一、引言:系统版本查询的重要性二、基础命令解析:cat /etc/Centos-release详

MySQL 临时表创建与使用详细说明

《MySQL临时表创建与使用详细说明》MySQL临时表是存储在内存或磁盘的临时数据表,会话结束时自动销毁,适合存储中间计算结果或临时数据集,其名称以#开头(如#TempTable),本文给大家介绍M... 目录mysql 临时表详细说明1.定义2.核心特性3.创建与使用4.典型应用场景5.生命周期管理6.注

MyBatis的xml中字符串类型判空与非字符串类型判空处理方式(最新整理)

《MyBatis的xml中字符串类型判空与非字符串类型判空处理方式(最新整理)》本文给大家介绍MyBatis的xml中字符串类型判空与非字符串类型判空处理方式,本文给大家介绍的非常详细,对大家的学习或... 目录完整 Hutool 写法版本对比优化为什么status变成Long?为什么 price 没事?怎

MySQL磁盘空间不足问题解决

《MySQL磁盘空间不足问题解决》本文介绍查看空间使用情况的方式,以及各种空间问题的原因和解决方案,文中通过示例代码介绍的非常详细,需要的朋友们下面随着小编来一起学习学习吧... 目录查看空间使用情况Binlog日志文件占用过多表上的索引太多导致空间不足大字段导致空间不足表空间碎片太多导致空间不足临时表空间

MySQL进行分片合并的实现步骤

《MySQL进行分片合并的实现步骤》分片合并是指在分布式数据库系统中,将不同分片上的查询结果进行整合,以获得完整的查询结果,下面就来具体介绍一下,感兴趣的可以了解一下... 目录环境准备项目依赖数据源配置分片上下文分片查询和合并代码实现1. 查询单条记录2. 跨分片查询和合并测试结论分片合并(Shardin

Java Stream流以及常用方法操作实例

《JavaStream流以及常用方法操作实例》Stream是对Java中集合的一种增强方式,使用它可以将集合的处理过程变得更加简洁、高效和易读,:本文主要介绍JavaStream流以及常用方法... 目录一、Stream流是什么?二、stream的操作2.1、stream流创建2.2、stream的使用2.

MySQL配置多主复制的实现步骤

《MySQL配置多主复制的实现步骤》多主复制是一种允许多个MySQL服务器同时接受写操作的复制方式,本文就来介绍一下MySQL配置多主复制的实现步骤,具有一定的参考价值,感兴趣的可以了解一下... 目录1. 环境准备2. 配置每台服务器2.1 修改每台服务器的配置文件3. 安装和配置插件4. 启动组复制4.

MySQL数据脱敏的实现方法

《MySQL数据脱敏的实现方法》本文主要介绍了MySQL数据脱敏的实现方法,包括字符替换、加密等方法,通过工具类和数据库服务整合,确保敏感信息在查询结果中被掩码处理,感兴趣的可以了解一下... 目录一. 数据脱敏的方法二. 字符替换脱敏1. 创建数据脱敏工具类三. 整合到数据库操作1. 创建服务类进行数据库

MySQL慢查询工具的使用小结

《MySQL慢查询工具的使用小结》使用MySQL的慢查询工具可以帮助开发者识别和优化性能不佳的SQL查询,本文就来介绍一下MySQL的慢查询工具,具有一定的参考价值,感兴趣的可以了解一下... 目录一、启用慢查询日志1.1 编辑mysql配置文件1.2 重启MySQL服务二、配置动态参数(可选)三、分析慢查

MYSQL中information_schema的使用

《MYSQL中information_schema的使用》information_schema是MySQL中的一个虚拟数据库,用于提供关于MySQL服务器及其数据库的元数,这些元数据包括数据库名称、表... 目录关键要点什么是information_schema?主要功能使用示例mysql 中informa