页面如下
SQL写法
select * from user where user_name like concat('%',\#{content}, '%')
or number like concat('%', #{content}, '%')
对于Mysql的数据库:
一般对于对个字段模糊查询的sql写法例如:
select * from Table1 where name like '%xxx%' or info like '%xxx%'
这样数据库执行起来效率十分低下,一个两个字段还好,一旦需要模糊查询的字段比较多的时候,问题就会出现,同时,开发人员需要拼接多个like
更好的办法:
在mysql中可以使用concat函数,将多个字段先拼接起来,然后再进行like的模糊匹配。
select * from Table1 where name like '%xxx%' or info like '%xxx%'
根据用户名或手机号模糊查找用户
user.name CONCAT('%',\#{keyWord},'%') OR user.phone LIKE CONCAT('%',\#{keyWord},'%')
// 根据一个keyword模糊匹配多个字段 (姓名, 电话, 地址 有一个匹配的)
<if test="keyWords != null and keyWords != ''">
AND (
user.name LIKE CONCAT('%',\#{keyWords},'%') OR
user.phone LIKE CONCAT('%',\#{keyWords},'%') OR
user.address LIKE CONCAT('%',\#{keyWords},'%')
)
</if>
多个字段拼接
// concat 拼接
AND concat(user.name, user.phone , user.address) LIKE CONCAT('%', #{condition}, '%')
// instr 关键字
and instr(concat(user.name, ',', user.phone, ',' , user.address), #{kjcx}) > 0
MySQL使用concat()函数时遇到null值的问题
**问题描述 : **
- 使用CONCAT()拼接结果是,当CONCAT()函数中的一个参数为null,那么不管其他字符串是否有值,最后返回的拼接结果总是null,如下所示:
解决办法
- 使用 COALESCE() 函数转换null值
AND concat( COALESCE(user.name, ''), COALESCE(user.phone, '') , COALESCE(user.address, '')) LIKE CONCAT('%', #{condition}, '%')
- 使用IFNULL() 函数转换null值
AND concat( ifnull(user.name, ''), ifnull(user.phone, '') , ifnull(user.address, '')) LIKE CONCAT('%', #{condition}, '%')
- 使用CONCAT_WS() 函数拼接字符串
SELECT
name,
address,
nationality,
CONCAT_WS(',',name,address,nationality) as str
FROM `user2`
instr 语法
instr 语法 instr(filed,str)
- 返回str子字符串在filed字符串的第一次出现的位置,如果没有找到,则返回0。备注:位置是从1开始的。当instr(filed,str)=0时,表示子符串str不存在于字符串filed中,因此可以用来实现mysql中的模糊查询,与like用法类似。
例:
select instr('abc','b') -- 1
select instr('abc','b') -- 2
select instr('abc','d') -- 0
case when instr(filed,'a') then 'a'
when instr(filed,'b') then 'b'
when instr(filed,'c') then 'c'
else '其他' end filed