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

应用背景

        业务表中的某个字段存储的值为数组,例如 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正则表达式。

  • 16
    点赞
  • 13
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值