1.情景展示

  有时候,我们需添加动态where条件,也就是多个if条件判断,如何实现?

  动态SQL还是很常见的,这里分情况说明

2.mybatis

  mybatis的用法相对简单,是我们经常会用到的

MySQL if end if 多条件 mysql多个if_ORACLE

  直接使用<if test=""></if>标签搞定即可

2.mysql

  动态where条件,通常会在存储过程中使用

MySQL if end if 多条件 mysql多个if_ORACLE_02

  通过if()函数实现,使用的关键点在于:1=1,当条件不成立时,执行的是:and 1=1,1=1永远成立,所以不影响其他限制条件的执行

3.oracle

  上面同样可以也能在oracle中通过decode()函数实现

MySQL if end if 多条件 mysql多个if_SQL_03

  关键点在于:变量为空的时候,自己=自己,否则的话变量和它作对比。

  mysql和oracle的难点在于:想不到原来还可以这样使用。 

updateTime--2021年10月28日11:25:29

4.关于mybatis的补充

  评论区的园友提出的意见很好,这里对mybatis标签的运用,进行一下补充说明。

  第一,where条件后面的动态SQL语句,有两种使用方式。

  情形1:where后面的第一个条件是必须存在的,后面的限制条件可有可无

  实现方式一:

  使用<if></if>标签

where NAME = #{name}
<if test="age != null and age != ''">
    and AGE = #{age}
</if>

  实现方式二:

  使用<where><if></if></where>标签

<where>
    <if test="name != null and name != ''">
        and NAME = #{name}
    </if>
    <if test="age != null and age != ''">
        and AGE = #{age}
    </if>
</where>

  反正name是非空的,就算加上非空判断也是可行。  

  情形2:where条件后面的条件,都是可有可无的

  实现方式一:

  使用<if></if>标签

where 1=1
<if test="name != null and name != ''">
    and NAME = #{name}
</if>
<if test="age != null and age != ''">
    and AGE = #{age}
</if>

  实现方式二:

  使用<where><if></if></where>标签

<where>
    <if test="name != null and name != ''">
        NAME = #{name}
    </if>
    <if test="age != null and age != ''">
        and AGE = #{age}
    </if>
</where>

  <where>和<if>组合语法说明:

  where 元素只有在1个以上的IF条件成立的情况下才会插入“WHERE”子句(当IF条件都不成立时,SQL语句末尾不会有where);   

  若where后面第一个IF条件成立,且前面带有AND关键词时,会自动将其过滤掉。

  其它语法说明:

  IF条件的test表达式中的and、or不能用&&、 ||代替,如果非要使用,需要转义;

  如果等式(=)左侧是动态字段(变量)的话,正确使用方式为:${变量名},例如:${name}。

写在最后

  哪位大佬如若发现文章存在纰漏之处或需要补充更多内容,欢迎留言!!!

作者:Marydon