数据库在进行查询的时候,经常看到有的人使用where 1=1和1=0,1=2等的查询,true 则不影响,false则不会扫描
是为了避免where 关键字后面的第一个词直接就是 “and”而导致语法错误,是为了后面附加and …方便程序逻辑处理用的。
请查看以下代码:
String sql="select * from table where 1=1";
if( conditon1) {
sql=sql+" and var2=value2";
}
if(conditon2) {
sql=sql+" and var3=value3";
}
注意:where 1=1 是为了避免where 关键字后面的第一个词直接就是 “and”而导致语法错误。其实,where 1=1的应用,仅仅只是为了满足多条件查询页面中不确定的各种因素而采用的一种构造一条正确能运行的动态SQL语句的一种方法。
扩展:
where 1=0; 这个条件始终为false,结果不会返回任何数据,只有表结构,可用于快速建表SELECT * FROM table WHERE 1 = 0; 该select语句主要用于读取表的结构而不考虑表中的数据,这样节省了内存,因为可以不用保存结果集。
创建一个新表,而新表的结构与查询的表的结构是一样的,但数据并不拷贝:
create table newtable as select * from oldtable where 1=0;
补充:
在 mybatis 中,为了防止此问题发生,加动态<where>可以自动将第一个and去掉,可以替代上述where 1=1的效果。