溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊(cè)×
其他方式登錄
點(diǎn)擊 登錄注冊(cè) 即表示同意《億速云用戶服務(wù)條款》

where 1=1

發(fā)布時(shí)間:2020-08-10 19:02:59 來(lái)源:ITPUB博客 閱讀:171 作者:zhuguoli200851 欄目:數(shù)據(jù)庫(kù)


文章轉(zhuǎn)載自「開(kāi)發(fā)者圓桌」一個(gè)關(guān)于開(kāi)發(fā)者入門(mén)、進(jìn)階、踩坑的微信公眾號(hào)
where 1=1
where 1=1有什么用?在SQL語(yǔ)言中,寫(xiě)這么一句話就跟沒(méi)寫(xiě)一樣,干嘛要出力不討好呢。


select * from table1 where 1=1與select * from table1完全沒(méi)有區(qū)別,甚至還有其他許多變種的寫(xiě)法如1<>2,'a'='a','a'<>'b'等,其目的就只有一個(gè),where 的條件為永真,得到的結(jié)果就是未加約束條件的。


在SQL注入時(shí)會(huì)用到這個(gè),例如select * from table1 where name='test'給強(qiáng)行加上select * from table1 where name='test' or 1=1這就又變成了無(wú)約束的查詢了。


然而where 1=1的妙處不僅如此,這些使用方法在書(shū)本中可能看不到,它們多數(shù)來(lái)自實(shí)際項(xiàng)目。


多條件查詢


在不定數(shù)量查詢條件情況下,where 1=1可以很方便的規(guī)范語(yǔ)句。例如一個(gè)查詢可能有name,age,phone查詢條件,也可能沒(méi)有,那該如何處理呢?


注意,這里寫(xiě)了一個(gè)多余的where 1=1。

String sql="select * from table1 where 1=1";

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 + "%'");

}

如果不寫(xiě)1=1呢,那么在每一個(gè)不為空的查詢條件面前,都必須判斷有沒(méi)有where子句,然后在第一個(gè)出現(xiàn)的地方加上where。


當(dāng)然,一般情況下是多表關(guān)聯(lián)查詢,如果SQL中已經(jīng)出現(xiàn)過(guò)where子句,那么就沒(méi)必要添加where 1=1了,例如:String sql=select * from table1,table2 where table1.id=table2.id


如果你正在使用Hibernate、Mybatis等ORM框架的話,這樣的問(wèn)題不需要擔(dān)心,這些ORM框架都進(jìn)行了良好的處理。下面是Mybatis的一個(gè)配置樣例:

<select id="findContact" parameterType="Map" resultMap="ContactResult">

select * from table1

<where>

<if test="cusId!=null and cusId!=' ' ">

and cusId = #{cusId}

</if>

</where>

</select>


表拷貝


所謂表的拷貝就是以一個(gè)表為源表,拷貝出一個(gè)數(shù)據(jù)和結(jié)構(gòu)都一樣的表,以O(shè)racle為例,其他數(shù)據(jù)庫(kù)語(yǔ)法自行參考,基本上大同小異。


拷貝表(where 1=1永為true,拷貝表結(jié)構(gòu)和數(shù)據(jù))

create   table_name   as   select   *   from   source_table   where   1=1;


復(fù)制表結(jié)構(gòu)(where 1<>1永為false,不拷貝數(shù)據(jù),僅復(fù)制表結(jié)構(gòu))

create   table_name   as   select   *   from   source_table   where 1<>1;


有很多技術(shù)書(shū)籍,并沒(méi)有使用where 1=1而是采用比較復(fù)雜的判斷邏輯,從這一點(diǎn)也可以看出書(shū)本知識(shí)與實(shí)踐的不同,在實(shí)踐中,開(kāi)發(fā)者會(huì)不斷使用省事省力的方法,而不是拘泥于書(shū)本。


where 1=1可能還有其他方面的應(yīng)用案例,大家不妨留言告知,精選出來(lái),讓更多人學(xué)會(huì)使用1=1這個(gè)小的技巧。

向AI問(wèn)一下細(xì)節(jié)

免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點(diǎn)不代表本網(wǎng)站立場(chǎng),如果涉及侵權(quán)請(qǐng)聯(lián)系站長(zhǎng)郵箱:is@yisu.com進(jìn)行舉報(bào),并提供相關(guān)證據(jù),一經(jīng)查實(shí),將立刻刪除涉嫌侵權(quán)內(nèi)容。

AI