多字段模糊查询_concat_instr

本文介绍了如何在MySQL中通过使用concat函数、COALESCE或IFNULL处理null值,以及instr关键字进行高效模糊查询,避免大量字段单独like带来的性能问题。重点讲解了如何结合COALESCE或IFNULL函数优化null值处理,以及instr函数在字符串搜索中的应用。
摘要由CSDN通过智能技术生成

页面如下
在这里插入图片描述

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,如下所示:
    在这里插入图片描述
    解决办法
  1. 使用 COALESCE() 函数转换null值
AND concat( COALESCE(user.name, ''), COALESCE(user.phone, '') , COALESCE(user.address, '')) LIKE CONCAT('%', #{condition}, '%')
  1. 使用IFNULL() 函数转换null值
AND concat( ifnull(user.name, ''), ifnull(user.phone, '') , ifnull(user.address, '')) LIKE CONCAT('%', #{condition}, '%')
  1. 使用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

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值