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 元素也知道如何将他们去除

浙公网安备 33010602011771号