試圖解決串接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