需求说明:
有时候,我们需要从数据库中模糊查询,但是字母有大写也有小写。
1:在执行查询的时候,需要忽略大小写。
2:以输入字母开头进行查询的
创建表:
数据库脚本:
CREATETABLE`base_new_info_abbreviation`(`id`int(11)NOTNULLAUTO_INCREMENT,`name`varchar()CHARACTERSETutf8COLLATEutf8_binDEFAULTNULLCOMMENT名称,`name_all`varchar()CHARACTERSETutf8COLLATEutf8_binDEFAULTNULLCOMMENT名称详情,`create_time`datetimeDEFAULTNULLCOMMENT创建时间,`create_by`varchar(64)CHARACTERSETutf8COLLATEutf8_binDEFAULTNULLCOMMENT创建人,`last_update_time`datetimeDEFAULTNULLCOMMENT最后更新时间,`last_update_by`varchar(64)CHARACTERSETutf8COLLATEutf8_binDEFAULTNULLCOMMENT最后更新人,`deRemove`int(11)DEFAULTNULLCOMMENT删除标记1未删除0已删除,`isAvailable`int(11)DEFAULTNULLCOMMENT显示状态0未显示1显示中,PRIMARYKEY(`id`))ENGINE=InnoDBAUTO_INCREMENT=1DEFAULTCHARSET=utf8;
插入数据:
insertinto`base_new_info_abbreviation`(`id`,`name`,`name_all`,`create_time`,`create_by`,`last_update_time`,`last_update_by`,`deRemove`,`isAvailable`)values(8,d,ss,-11-:00:52,admin,-01-:00:52,admin,1,1),(76,DNA,DeoxyribonucleicAcid脱氧核糖核酸,-10-:49:52,zhanggh,-10-:56:16,zhanggh,1,1),(78,DNA,DefenseNuclearAgency国防部原子能机构,-10-:56:52,zhanggh,-10-:57:34,zhanggh,1,1),(80,DNA,DataNotAvailable数据不存在,-10-:57:27,zhanggh,-10-:57:34,zhanggh,1,1);
假设用户现在要查询name是D或者d开头的数据怎么?
解决需求一,忽略大小写的。可以先查询大写,在查询小写。然后union下
先查询出所有小写字母d开头的:
在查询出所有大写字母D开头的
使用union进行连接。
当然这样也可以得到最终的结果。但是这样执行从效率上来说很不好。
解决需求二:以输入字母开头进行模糊查询
在上面语句中我们可以看到使用的是‘d%’或者是D%这样看上去好像有点不是很好。
综上要想解决并优化实现查询 D或者d开头的可以使用到以下三个函数:
函数一:upper(keyword)。大写函数
函数二:lower(keyword)。小写函数
函数三:concat(str1,str2)。连接函数。
接下来查看优化后的sql语句:
SELECTid,NAME,name_allASname_all
FROMbase_new_info_abbreviationWHERE1=1ANDdeRemove=1ANDisAvailable=1ANDNAMELIKEUPPER(CONCAT(D,%))ORNAMELIKELOWER(CONCAT(d,%))ORDERBYNAME
同样达到我们需要的结果了。