mysql如何匹配数组字段中的某一个具体值

 更新时间:2024年11月06日 09:13:54   作者:樘棣寂寂  
在数据库操作中,有时需要查询数组字段中包含特定值的数据,传统like查询可能会带来错误结果,如查询包含数字1的数组可能错误返回包含数字10的结果,为此,可以使用MySQL的FIND_IN_SET函数或REGEXP正则表达式进行精确匹配,FIND_IN_SET适用于匹配单个固定值

应用背景

业务表中的某个字段存储的值为数组,例如 1,2,3 。

现在需要查询其中一个值是数组里面的对应的一个值,该如何匹配。

就比如subject这个字段为一个数组,现在需要查询subject包含1的学生。

使用模糊查询的问题

因为subject里面存的不是具体的一个值,所以使用=显然是不行的,这个时候大家首先会想到like的模糊查询,我们一起来看看效果

SELECT
	* 
FROM
	`stu_c` 
WHERE
	subject LIKE '%1%'

执行结果

可以看到将张三跟王五都查出来了,这显然跟我们的需求不符,需求是只包含1的,应该只查出来张三这条数据才对。

解决方案一

使用mysql中的FIND_IN_SET(str,fieldName)函数,str是要查询的字符串,fieldName是字段名,参数以“,”分隔,例如1,2,3

匹配单个(只包含1)sql语句如下

SELECT * FROM stu_c WHERE FIND_IN_SET('1', subject) > 0 

匹配单个(只包含1)执行结果

查出了subject包含1的学生信息

匹配多个(包含1跟3)sql语句如下

SELECT * FROM stu_c
WHERE FIND_IN_SET('1', subject) > 0 OR FIND_IN_SET('3', subject) > 0;

匹配多个(包含1跟3)执行结果

查出了subject包含1跟3的学生信息

解决方案二

使用REGEXP正则表达式匹配,REGEXP语法更加强大,功能更全,可以根据不同的需求选择不同的用法,本文主要讲查询包含这个字符的数据

匹配单个(只包含1)sql语句如下

SELECT
	* 
FROM
	`stu_c` 
WHERE
	CONCAT ( ',', subject, ',' ) REGEXP ',(1),'

匹配单个(只包含1)执行结果

查出了subject包含1的学生信息

匹配多个(包含1跟3)sql语句如下

SELECT
	* 
FROM
	`stu_c` 
WHERE
	CONCAT ( ',', subject, ',' ) REGEXP ',(1|3),'

匹配多个(包含1跟3)执行结果

查出了subject包含1跟3的学生信息

总结

两种方式都能解决匹配数组字段中某一个具体值的问题,但是也有差异,有各自的优缺点,例如FIND_IN_SET(str,fieldName)函数,如果前端页面是多选项,也就是需要匹配满足多个值的情况,就需要使用or拼接sql,但是REGEXP只需要把参数转换为我们需要的格式(',(1|3),')即可。

如果项目需求只需匹配一个值,FIND_IN_SET函数直接在xml中使用就行,REGEXP仍需要将单个参数转换为特定的格式(,(1),)。

综上所述,单个值匹配建议用FIND_IN_SET函数,多个值匹配建议用REGEXP正则表达式。

以上为个人经验,希望能给大家一个参考,也希望大家多多支持脚本之家。

相关文章

  • MySQL深分页问题解决思路

    MySQL深分页问题解决思路

    这篇文章主要介绍了优雅地解决mysql深分页问题,本文将会讨论当mysql表大数据量的情况,如何优化深分页问题,并附上最近的优化慢sql问题的案例伪代码,需要的朋友可以参考下
    2022-12-12
  • Fedora环境下装MySQL命令方法介绍

    Fedora环境下装MySQL命令方法介绍

    刚刚涉及mysql如果有不对的地方,请大家指正,希望自己的一点点经验,能够帮到大家
    2012-11-11
  • mysql 5.7.21 winx64安装配置方法图文教程

    mysql 5.7.21 winx64安装配置方法图文教程

    这篇文章主要为大家详细介绍了mysql 5.7.21 winx64安装配置方法图文教程,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2018-02-02
  • MySQL8设置自动创建时间和自动更新时间的实现方法

    MySQL8设置自动创建时间和自动更新时间的实现方法

    在实际应用中,我们时常会需要用到创建时间和更新时间这两个字段,下面这篇文章主要给大家介绍了关于MySQL8设置自动创建时间和自动更新时间的实现方法,需要的朋友可以参考下
    2023-03-03
  • SQL重复记录查询 查询多个字段、多表查询、删除重复记录的方法

    SQL重复记录查询 查询多个字段、多表查询、删除重复记录的方法

    下面小编就为大家带来一篇SQL重复记录查询 查询多个字段、多表查询、删除重复记录的方法。小编觉得挺不错的,现在就分享给大家,也给大家做个参考。一起跟随小编过来看看吧
    2016-09-09
  • MySQL聚簇索引和非聚簇索引的区别详情

    MySQL聚簇索引和非聚簇索引的区别详情

    这篇文章主要介绍了MySQL聚簇索引和非聚簇索引的区别详情,文章围绕主题展开详细的内容介绍,具有一定的参考价值,需要的朋友可以参考一下
    2022-06-06
  • MySQL数据库数据视图

    MySQL数据库数据视图

    这篇文章主要介绍了MySQL数据库数据视图,视图是原始数据库数据的一种变换,是查看表中数据的另外一种方式,文章围绕主题展开详细的内容介绍,具有一定的参考价值,需要的朋友可以参考一下
    2022-08-08
  • MySQL8.4设置密码规则为mysql_native_password问题

    MySQL8.4设置密码规则为mysql_native_password问题

    这篇文章主要介绍了MySQL8.4设置密码规则为mysql_native_password问题,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教
    2024-08-08
  • Windows平台配置5.7版本+MySQL数据库服务

    Windows平台配置5.7版本+MySQL数据库服务

    这篇文章主要介绍了Windows平台配置5.7版本+MySQL数据库服务的方法,包括初始化root用户密码password的过程以及两个常见问题的解决方法,需要的朋友参考下吧
    2017-06-06
  • MySQL中Truncate用法详解

    MySQL中Truncate用法详解

    Truncate是一个能够快速清空资料表内所有资料的SQL语法。这篇文章介绍了Truncate用法及注意事项,并和drop,delete方法进行对比。需要的朋友可以收藏下,方便下次浏览观看
    2021-12-12

最新评论