我們在看別人項目的時候,很多時候看到這樣的SQL語句:
select * from user where 1=1
其中這個where1=1是有特殊意義的,包含以下兩種情境:動態SQL拼接和查詢表結構。
一 動態SQL拼接
適合多條件搜索,當要構造動態sql語句時為了防止sql語句結構不當,所以加上where 1=1 ,這樣SQL語句不會報錯,例如:
String sql="select * from table_name where 1=1"; if( conditon 1) { sql=sql+"var2=value2"; } if(conditon 2) { sql=sql+" and var3=value3"; }
在這個例子中,當兩個if 都不成立的時候,或者僅有第一個if 成立的時候,SQL語句拼接就會出現錯誤。當我們的SQL語句加上where 1=1的時候,就不報錯了,如下:
String sql="select * from table_name where 1=1"; if( conditon 1) { sql=sql+" and var2=value2"; } if(conditon 2) { sql=sql+" and var3=value3"; }
SQL語句加上where 1=1,只是為了滿足多條件查詢頁面中不確定的各種因素而采用的一種構造一條正確能運行的動態SQL語句的一種方法。
二 查詢表結構
優點:數據庫開銷小。
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)的寫法將是非常可去取的,因為系統僅會讀取結構信息,而不會將具體的表記錄讀入內存中,這無疑節省了系統開銷。
