where 1 =1 ?

1.where 1 = 1  动态sql拼接

之前经常会看到在 kylin 查询 或则 报表应用 上会看到 where 1 = 1 ,当时只知道这个条件为 true.

后来了解到 1 = 1  常用于 应用程序根据用户选择项的不同拼凑where 条件时 用的.

例如 java 动态sql拼接:

1 String sql="select * from table_name  where 1=1";
2         if( conditon 1) {
3               sql = sql +"  and  var2=value2";
4             }
5         if(conditon 2) {
6               sql = sql +"  and var3=value3";
7            }

where 1=1 是为了避免where 关键字后面的第一个词直接就是 “and”而导致语法错误。

如果不用1=1的话,每加一个条件,都要判断前面有没有where 条件,如果没有就写where ...,有就写and语句,因此此时用1=1可以简化了应用程序的复杂度。

 

2.where 1<> 1 查询表结构

where 1=1是sql语句条件逻辑判断表达式,由于1=1成立,恒为真,该表达式1=1将始终返回"真"。这种写法实际目的是为了获取逻辑值"True",其实诸如2=2, 1+2=3,'中'='中'等之类的写法都可以返回逻辑值"True",只不过1=1的运算开销更小,故被应用的最普遍。下面例子将有助于理解有关概念:

 

1) select * from t1 where 1=1;
-- 实际等效于select * from t1 where true;-- 语句将返回t1中所有的记录行

2) select * from t1 where 1<>1;
-- 实际等效于 select * from t1 where false;-- 语句将返回空记录集


说明:例1)实际上等同于不加任何筛选条件,有些画蛇添足,where 1=1的实际意义不如where 1<>1(或者where 1=0)来得有用,当我们只需要获取表的字段(结构)信息,而不需要理会实际保存的记录时,例2)的写法将是非常可去取的,因为系统仅会读取结构信息,而不会将具体的表记录读入内存中,这无疑节省了系统开销

 

3.mybatis 解决动态拼接的where 1=1

 

 1 <!--查询用户列表根据用户名称和用户性别查询用户列表–->
 2 <select id="findUserList" parameterType="queryVo" resultType="user">
 3        select id,username username_ from user
 4         <!-- where自动将第一个and去掉–->
 5         <where>
 6             <!-- 这里调用queryVo的getUser方法获取user的值–->
 7             <if test="user!=nulL">
 8                 <!-- 这里调用queryVo的user的getUsername方法获取usenname的值–->
 9                 <if test="user.username!=null and user.username!=''">
10                     and user.username = #{user.username}
11                 </if>
12                 <if test="user.sex!=null and user.sex!='' ">
13                     and user.sex =#{user.sex}
14                 </if>
15             </if>
16         </where>

 

where 元素知道只有在一个以上的if条件有值的情况下才去插入“WHERE”子句。而且,若最后的内容是“AND”或“OR”开头的,where 元素也知道如何将他们去除

 

posted @ 2021-01-05 10:12  黑桃G  阅读(427)  评论(0)    收藏  举报