[SQL]動態查詢條件

  • 1740
  • 0
  • SQL
  • 2017-04-12

試圖解決串接where條件的問題

每次在寫查詢的時候  有時候都會有一堆要填不填的欄位

就每次都要在那邊判斷欄位是不是空白還是null 在那邊if if if if if  sql+=  sql+=

一樣餵狗找解答看有沒有更聰明的寫法  看到一個很黑暗的網頁[1]

原來SQL還可以這樣組啊 終於不用做串燒了

Model bind進去就好惹

寫出來的SQL就長這樣

select *
from [Table]
where (@No IS NULL OR No = @No) AND (@Name IS NULL OR Name = @Name) 
AND (@ID IS NULL OR ID = @ID) AND (@Mobile IS NULL OR Mobile = @Mobile) 

參數這樣放

SqlCommand cmd = new SqlCommand(sql, conn);   //sql 就sql指令 conn連線字串      
cmd.Parameters.Add("@No", SqlDbType.VarChar).value = model.No ?? (object)DBNull.Value;
cmd.Parameters.Add("@Name", SqlDbType.NVarChar).value = model.Name ?? (object)DBNull.Value;
cmd.Parameters.Add("@ID", SqlDbType.VarChar).value = model.ID ?? (object)DBNull.Value;
cmd.Parameters.Add("@Mobile", SqlDbType.VarChar).value = model.Mobile ?? (object)DBNull.Value;

看起來有87%完美

Select * 是我偷懶 一般建議把需要的欄位寫出來 不要用星號會比較好

順帶一提如果很愛串燒也記得使用參數化查詢  不知道為啥一堆人都不用 放給他sql injection的漏洞...   是我太菜不懂前人的高級寫法嗎.....

不過這樣得寫法有效能問題就是了 詳細請去看黑暗執行緒的文章吧

大guy4這樣

同場追加PL/SQL寫法

SELECT CODE,ID,ADDRESS,NOTE
FROM [Table]
WHERE CODE = NVL(?,CODE)
AND ID = NVL(?,ID)
AND ADDRESS = NVL(?,ADDRESS

上方的寫法有個問題  如果資料庫該欄位值為Null 會查詢不到資料  建議還是使用下方的寫法
select CODE,ID,ADDRESS
from [TABLE]
WHERE (? is null or CODE = ?) AND
(? is null or ID = ?) AND
(? is null or ADDRESS = ?)

不知道Oracle的參數是不是只能用?號   這樣我要一直重複放參數..

並且還要照順序放 有夠不科學的...

上述的寫法都是走 index scan  如果資料量大不建議這麼寫

Reference

1. http://blog.darkthread.net/post-2015-08-18-where-is-null-or-trick.aspx

2. http://blog.darkthread.net/post-2015-08-17-where-1-1-and-performance.aspx