在Asp.Net網站或者Java網站的程式設計的過程中,很多時候我們可以看到拼接SQL語句的寫法的時候都可以看到最前面有個Where 1=1這個條件,其實Where 1=1這是個恆等式,SQL語句寫成Where 1=1的形式可以更好的拼接查詢語句條件。 結論:Where 1=1為恆等式,拼接SQL語 ...
在Asp.Net網站或者Java網站的程式設計的過程中,很多時候我們可以看到拼接SQL語句的寫法的時候都可以看到最前面有個Where 1=1這個條件,其實Where 1=1這是個恆等式,SQL語句寫成Where 1=1的形式可以更好的拼接查詢語句條件。
結論:Where 1=1為恆等式,拼接SQL語句使用Where 1=1這個語句段主要是為了後續更好的拼接成完成的SQL語句。
舉例,前臺頁面可能傳入參數Name和Code兩個參數值,都是對應SQL語句查詢條件,但這兩個查詢條件也可全為空,即不傳實際參數,在程式中我們時常會看到下麵的寫法。
string sql="Select * FRom TableA Where 1=1"; if( string.IsNullOrWhiteSpace(Name)) { sql=sql+string.Format(" AND Name={0}",Name); } if( string.IsNullOrWhiteSpace(Code)) { sql=sql+string.Format(" AND Code={0}",Code); }
使用了Where 1=1這個恆等式後,後續只需要判斷對應的屬性值是否為空,不為空直接加入對應的拼接SQL語句段。如果不加入Where 1=1這個條件,代碼可讀性就會變得更差,可能出現下列幾種情況,讀者可自行思考下。
(1)Name和Code的值都為空,則Sql語句是不能帶Where的,直接是:Select * FRom TableA
(2)如果Name、Code有一個為空,另一個不為空的時候,Sql語句是不會帶有And這個關鍵字,Sql最終語句要麼為Select * FRom TableA Where Name=@Name 要麼為Select * FRom TableA Where Code=@Code;
(3)如果Name、Code都不為空的時候,語句中就含有AND這個關鍵字,但Name條件前不會有AND關鍵字。可以想象下如果有10個查詢條件,是不是還要判斷下那個查詢條件屬性是SQL語句中的第一個查詢欄位。這樣的判斷就麻煩多了。
當然如果不用Where 1=1這種寫法,還有種稍微容易閱讀的方法可採用,就是單獨定義個欄位sqlFilter用於查詢條件的拼接,最後判斷下sqlFilter是否為空,如果不為空,則截取掉該sqlFilter字元串的最前面幾個字元 AND之後得到最終查詢條件,拼接到查詢語句Sql中。
備註:原文轉載自博主個人技術站點IT技術小趣屋,原文鏈接程式設計過程中SQL語句Where 1=1的作用_IT技術小趣屋。