where 1=1

文章轉載自「開發者圓桌」一個關於開發者入門、進階、踩坑的微信公衆號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這個小的技巧。

相關文章
相關標籤/搜索