文章转载自「开发者圆桌」一个关于开发者入门、进阶、踩坑的微信公众号sql
where 1=1有什么用?在SQL语言中,写这么一句话就跟没写同样,干吗要出力不讨好呢。数据库
select * from table1 where 1=1与select * from table1彻底没有区别,甚至还有其余许多变种的写法如1<>2,'a'='a','a'<>'b'等,其目的就只有一个,where 的条件为永真,获得的结果就是未加约束条件的。微信
在SQL注入时会用到这个,例如select * from table1 where name='test'给强行加上select * from table1 where name='test' or 1=1这就又变成了无约束的查询了。app
然而where 1=1的妙处不只如此,这些使用方法在书本中可能看不到,它们多数来自实际项目。框架
多条件查询开发
在不定数量查询条件状况下,where 1=1能够很方便的规范语句。例如一个查询可能有name,age,phone查询条件,也可能没有,那该如何处理呢?入门
注意,这里写了一个多余的where 1=1。table
String sql="select * from table1 where 1=1";test
StringBuffer buffer = new StringBuffer();配置
buffer.append(sql);
if (null != name && !"".equals(name)) {
buffer.append(" and name = " + name);
}
if (null != age && !"".equals(age)) {
buffer.append(" and age = " + age);
}
if (null != phone && !"".equals(phone)) {
buffer.append(" and phone like '%" + phone + "%'");
}
若是不写1=1呢,那么在每个不为空的查询条件面前,都必须判断有没有where子句,而后在第一个出现的地方加上where。
固然,通常状况下是多表关联查询,若是SQL中已经出现过where子句,那么就不必添加where 1=1了,例如:String sql=select * from table1,table2 where table1.id=table2.id
若是你正在使用Hibernate、Mybatis等ORM框架的话,这样的问题不须要担忧,这些ORM框架都进行了良好的处理。下面是Mybatis的一个配置样例:
<select id="findContact" parameterType="Map" resultMap="ContactResult">
select * from table1
<where>
<if test="cusId!=null and cusId!=' ' ">
and cusId = #{cusId}
</if>
</where>
</select>
表拷贝
所谓表的拷贝就是以一个表为源表,拷贝出一个数据和结构都同样的表,以Oracle为例,其余数据库语法自行参考,基本上大同小异。
拷贝表(where 1=1永为true,拷贝表结构和数据)
create table_name as select * from source_table where 1=1;
复制表结构(where 1<>1永为false,不拷贝数据,仅复制表结构)
create table_name as select * from source_table where 1<>1;
有不少技术书籍,并无使用where 1=1而是采用比较复杂的判断逻辑,从这一点也能够看出书本知识与实践的不一样,在实践中,开发者会不断使用省事省力的方法,而不是拘泥于书本。
where 1=1可能还有其余方面的应用案例,你们不妨留言告知,精选出来,让更多人学会使用1=1这个小的技巧。