MySQL中的模糊查询
好久都没用MyBatis框架了,今天竟让犯了一个极蠢的错误。
MySQL中的模糊查询,主要使用like
关键字。
如:
select * from eq_info where eq_name like '空调%';
表示查找 eq_info
表的所有数据,eq_name字段要以空调
开头,后面任意。
select * from eq_info where eq_name like '空调_';
表示查找 eq_info
表的所有数据,eq_name字段要以空调
开头,后面只有一个字( 一个下划线表示一个字符)。
select * from eq_info where eq_name like '%空调%';
前面后面都无所谓,只要包含有空调
二字。
select * from eq_info where eq_name like '%:%%' escape ':';
如果想查找的内容里有百分号(%),但因为%本身就是通配符,这个时候就需要使用escape
关键字定义一个转义字符。
比如这里定义的是冒号(:),但首先要确保,查找的内容当中没有冒号(:)这个符号,仅仅是用来作为转移符。
这里的like
表示的就是,前面无所谓(%), 后面无所谓(%), 中间有个转义字符(😃, 提示要查找的就是下一个符号(%).
另外:
如果定义的转义字符是反斜杠(\),那么escape
后面就不能是''了,因为\会把后面的单引号转义。应该写成这样:escape '\\'
.
而我今天所犯的错误,就是使用MyBatis框架进行模糊查询的时候,语句是这样的(错误的):
<if test="equipment.name != null and equipment.name != ''">
and e.name like '%'+#{equipment.name}+'%'
</if>
太蠢了,我竟然忘记了MySQL中字符串拼接并非使用加号(+),而应该是使用concat
函数。
以下是正确的方法:
<if test="equipment.name != null and equipment.name != ''">
and e.name like concat('%',#{equipment.name},'%')
</if>
更新
其实,使用双引号也可以,更简单,但只能使用双引号,单引号不行:
<if test="equipment.name != null and equipment.name != ''">
and e.name like "%"#{equipment.name}"%"
</if>