Mybatis mysql模糊查询(CONCAT多个字段)及bug

11 篇文章 0 订阅
1 篇文章 0 订阅

先看下如下xml

 SELECT
    t.id,
    t.mobile,
    t.account_name
  FROM
    t_account t
    WHERE
  	 1=1
    <if test="keyWord !=null and keyWord !=''">
        and CONCAT(t.id,t.mobile,t.account_name) like CONCAT('%',#{keyWord},'%')
    </if>

正常来说这样写没问题的但是如果你CONCAT的字段中有一个字段为null时,那这条数据将查询不到,说白了,只要有一个字段为null,就查不到数据了。

先看下以下数据。
在这里插入图片描述
从上图可以发现,id为7的mobile为null的,接下来咱们测试下结果。

  • 根据account_name模糊查询:
  • 查询柳岩是能查到数据的,如下图
    在这里插入图片描述
  • 查询张三是查询不到数据的,如下图

在这里插入图片描述

  • 根据Id查id为7的也是查不到的,如下图

在这里插入图片描述

结论:CONCAT的字段中有任意一个字段为null时,那这条数据将查询不到

解决方案:一

改成用or连接

 SELECT
    t.id,
    t.mobile,
    t.account_name
  FROM
    t_account t
    WHERE
  	 1=1
    <if test="keyWord !=null and keyWord !=''">
        and CONCAT(t.id) like CONCAT('%',#{keyWord},'%')
        or CONCAT(t.mobile) like CONCAT('%',#{keyWord},'%')
        or CONCAT(t.account_name) like CONCAT('%',#{keyWord},'%')
    </if>

看下运行结果:查到张三这条数据了
在这里插入图片描述

解决方案:二

判null处理

 SELECT
    t.id,
    t.mobile,
    t.account_name
  FROM
    t_account t
    WHERE
  	 1=1
        and CONCAT( IFNULL(t.id,''),IFNULL(t.mobile,''),IFNULL(t.account_name,'') ) like CONCAT('%',#{keyWord},'%')

在这里插入图片描述

  • 4
    点赞
  • 12
    收藏
    觉得还不错? 一键收藏
  • 8
    评论
评论 8
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值