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

目录
  • Mybatis mysql模糊查询及bug
    • 解决方案:一
    • 解决方案:二
  • mybatis多个字段如何模糊查询一个值

Mybatis mysql模糊查询及bug

先看下如下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},'%')

mybatis多个字段如何模糊查询一个值

使用oracle concat 函数拼接字符 再进行like 操作

<if test="searchContent!=null and searchContent!=''">
CONCAT(CONCAT(CONCAT(CONCAT(venderDesc,purcher),demandOrg),contactInfo),materialDesc) like#{searchContent}
</if>

注:venderDesc,purcher,demandOrg,contactInfo,materialDesc为表的字段,想要拼接哪个字段就拼哪个字段

有些作者说 CONCAT(venderDesc,purcherdemandOrg,demandOrg,contactInfo,materialDesc) 这样也能实现,但本人经测试这个是不行的,会报参数错误,可能是跟数据库的版本有关。

以上为个人经验,希望能给大家一个参考,也希望大家多多支持我们。

(0)

相关推荐

  • mybatis中orderBy(排序字段)和sort(排序方式)引起的bug及解决

    目录 引言 问题叙述 下面尝试采用第二种方式 第三种方式 3.1 首先是什么都不传 3.2 传入排序字段oderBy 引言 记录一个mybatis实现动态字段的排序和动态的升降序问题 实现效果如下: 问题叙述 在这里无论使用postman是否传递sort的值, 都不生效, postman 执行的sql日志 ==>  Preparing: select sum(acd.read_view_count) as read_view_count,sum(acd.read_person_count) as

  • Mybatis中如何使用sum对字段求和

    目录 使用sum对字段求和 避免Mybatis sum求和返回null 使用sum对字段求和 如下sql,为计算用户收益总和:   <select id="getTotalIncome" resultType="com.lws.test.modules.user.entity.UserIncomeEntity">     select sum(income) as totalIncome     from income_log     where uid

  • MyBatis动态SQL如何实现前端指定返回字段

    目录 动态SQL实现前端指定返回字段 问题描述 解决方案 MyBatis如何返回部分字段 .xml文件中resultMap的type改为 第二种很笨的方法 动态SQL实现前端指定返回字段 问题描述 在使用ClickHouse时,遇到需要根据业务需求,动态返回指定字段,从而充分利用ClickHouse列式存储的优势. 解决方案 可用MyBatis的动态SQL进行数据返回:故可在业务层将指定返回的列传入数据层,利用foreach标签进行遍历返回数据. 代码实现 1.请求参数 @Data public

  • Mybatis如何按顺序查询出对应的数据字段

    目录 Mybatis按顺序查询出对应的数据字段 解决方法 Mybatis基本查询.条件查询.查询排序 Mybatis按顺序查询出对应的数据字段 今天遇到一个问题,就是写xml文件时,返回的顺序始终不一致,无论我sql语句写的如何好,前端接收到的数据都是乱的.终于,我发现到了原因. 原来我的查询返回resultType = "map"  , 也就是这个map, 打乱了顺序. 因为map 并不保证存入取出顺序一致, 因此,打乱顺序可想而知了. 解决方法 resultType = "

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

    目录 Mybatis mysql模糊查询及bug 解决方案:一 解决方案:二 mybatis多个字段如何模糊查询一个值 Mybatis mysql模糊查询及bug 先看下如下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

  • MyBatis中模糊查询使用CONCAT('%',#{str},'%')出错的解决

    目录 模糊查询使用CONCAT('%',#{str},'%')出错 原因及解决 MyBatis like模糊查询,CONCAT函数用法 以MySQL为例 模糊查询使用CONCAT('%',#{str},'%')出错 原因及解决 经过我一套乱七八糟毫无思路地查找后,发现不是Mybatis的原因,原来是SQL server不支持CONCAT函数,直接用加号连接就好 MyBatis like模糊查询,CONCAT函数用法 以MySQL为例 <select id="getByPage"

  • mybatis 使用concat 模糊查询方式

    目录 使用concat 模糊查询 本举例 注意 模糊查询使用concat('%',#{str},'%')出错 使用concat 模糊查询 <select id="queryByKeyWord" resultType="com.mingdutech.xelerator.eln.dto.ApparatusDto"> select distinct b.* from base_apparatus b left join base_apparatus_colum

  • Mybatis使用MySQL模糊查询时输入中文检索不到结果怎么办

    项目开发中,在做Mybatis动态查询时,遇到了一个问题:MySQL在进行LIKE模糊查询时,输入英文可以正常检索出结果,但是输入中文后检索得到的结果为空. 由于是使用GET方式请求,所以为了确保中文不乱码,在控制台接收到请求参数后,对中文进行了一次编码. try { realName = new String(realName.getBytes("GBK"), "UTF-8"); } catch (UnsupportedEncodingException exce

  • MyBatis实现模糊查询的几种方式

    在学习MyBatis过程中想实现模糊查询,可惜失败了.后来上百度上查了一下,算是解决了.记录一下MyBatis实现模糊查询的几种方式. 数据库表名为test_student,初始化了几条记录,如图: 起初我在MyBatis的mapper文件中是这样写的: <select id="searchStudents" resultType="com.example.entity.StudentEntity" parameterType="com.exampl

  • 浅谈MySQL模糊查询中通配符的转义

    sql中经常用like进行模糊查询,而模糊查询就要用到百分号"%",下划线"_"这些通配符,其中"%"匹配任意多个字符,"_"匹配单个字符.如果我们想要模糊查询带有通配符的字符串,如"60%","user_name",就需要对通配符进行转义,有两种方式.如下:   1.反斜杠是转义符,通过反斜杠来转义%,使其不再是通配符.这里第一个%是通配符,第二个%不是通配符. select perc

  • MySQL模糊查询用法大全(正则、通配符、内置函数)

    SELECT * from table where username like '%陈哈哈%' and hobby like '%牛逼' 这是一条我们在MySQL中常用到的模糊查询方法,通过通配符%来进行匹配,其实,这只是冰山一角,在MySQL中,支持模糊匹配的方法有很多,且各有各的优点.好了,今天让我带大家一起掀起MySQL的小裙子,看一看模糊查询下面还藏着多少鲜为人知的好东西. 一.MySQL通配符模糊查询(%,_) 1-1. 通配符的分类 "%" 百分号通配符: 表示任何字符出现

  • 深入探究Mysql模糊查询是否区分大小写

    前言 近期,一直在忙着写一个小小的个人博客项目,在实现 "全局搜索" 功能时,发现mysql模糊查询语句有点儿神奇(本小白刚刚步入编程阶段,所以可能让大家见笑了,哈哈哈),有时候 mysql模糊查询语句区分大小写,有时候 mysql查询语句又不区分度大小写,于是,做了很多次实验,得出以下结论(可能有不对的地方,欢迎大佬们可以指出我的不足,也欢迎小伙伴们可以一起讨论问题!) 先来介绍一下COLLATE,COLLATE通常是和数据编码(CHARSET)相关的,一般来说每种CHARSET都有

  • 解决mysql模糊查询索引失效问题的几种方法

    我们在使用like %通配符时常常会引起索引失效的问题. 这里,我们讨论一下like使用%的几种情况: 下列例子用到的索引(VC_STUDENT_NAME) 一.like 'xx%' EXPLAIN select * from t_student where VC_STUDENT_NAME like '王%' 我们发现使用%不放在开头的时候,索引是有效的 二.like '%xx' EXPLAIN select * from t_student where VC_STUDENT_NAME like

  • MySql模糊查询json关键字检索方案示例

    目录 前言 方案一: 方案二: 方案三: 方案四(最终采用方案): 总结 前言 ​最近在项目中遇到这样一个需求:需要在数据表中检索包含指定内容的结果集,该字段的数据类型为text,存储的内容是json格式,具体表结构如下: CREATE TABLE `product` ( `id` INT(11) UNSIGNED NOT NULL AUTO_INCREMENT COMMENT 'ID', `name` VARCHAR(100) NOT NULL DEFAULT '' COMMENT '产品名称

随机推荐