应用背景
业务表中的某个字段存储的值为数组,例如 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正则表达式。
以上为个人经验,希望能给大家一个参考,也希望大家多多支持代码网。
发表评论