2012-01-11 14 views
0
可變數量

可能重複:
Conditional Check in Where clause最好的辦法讓搜索SQL查詢的參數

我有幾個參數,我可以爲了從表中搜索數據提供:

- DateFrom 
- DateTo 
- Name 
- TypeId 

我有一個代碼需要改進。在應用程序代碼中,我有一個函數可以獲取所有這些參數,並根據我使用IF語句提供的參數構建不同的查詢。
我不知道有沒有更好的方法來做到這一點?
僅使用參數創建一個查詢,並且如果沒有參數,則忽略它。
所以我沒有做到這一點:

select...where DateFrom = 'someDate' 
select...where DateFrom = 'someDate' and DateTo = 'someDate' 
select...where DateFrom = 'someDate' and DateTo = 'someDate' and Name = 'someName' 
etc. 
+0

複製重複副本的副本......請閱讀有關此問題的最佳文本:T-SQL中的動態搜索條件,由Erland Sommarskog提供:http://www.sommarskog.se/dyn- search.html – 2012-01-11 16:09:20

回答

3

嘗試的做法很簡單,假設你的參數的名稱@Begin,@End,@Name:

select... 
where 
    (@Begin IS NULL OR DateFrom = @Begin) 
and (@End is NULL OR DateTo = @End) 
and (@Name is NULL OR Name = @Name) 
... 

然後,如果你將參數的值作爲NULL傳遞 - 然後查詢將跳過它

+0

+1正確的解決方案:) – 2012-01-11 09:45:47

+1

由於OP使用的是SQL Server 2008,所以最有可能使用'OPTION(RECOMPILE)'(取決於確切的SQL Server子版本:http://www.sommarskog.se /dyn-search-2008.html#SPandCUs),它可以在運行時解析局部變量,並基本刪除「或」,並在有索引時使用索引。 – 2012-01-11 16:12:18

+0

那很容易:) – mikebertiean 2016-05-16 20:23:26

0

使用通用的util類來控制它。

getSqlParams(String dateFrom)
getSqlParams(String dataFrom,DateTo)

等。也許可以幫助你。因爲不同的參數意味着不同的維度。
使用If真的好難看。 :(