2010-05-05 61 views
1

我有2個字段的表學生搜索:編寫SQL與多個條件

Name: nvarchar(256) 
Age: int 

用戶將使用一個WinForm應用程序輸入名稱和用於搜索時代。

  • 如果輸入的名稱爲空,sql將不會查詢名稱字段。
  • 如果輸入的Age是0,sql將不會查詢Age字段。
  • 如果名稱爲空且輸入名稱爲空 - >記錄匹配。如果名稱爲空且輸入的名稱不爲空 - >記錄不匹配。 Age字段也類似。

我的問題是,如何寫這樣的SQL。

P/S:我使用SQL Server 2005.

請幫幫我。謝謝。

回答

3

一種方法是使參數爲空的,並使用此模式:

Create Procedure MyTest 
(
    @param1 int = NULL, 
    @param2 varchar = NULL 
) 
AS 
BEGIN 

SELECT Blah... 
FROM Table 
WHERE 
    ((@param1 IS NULL) OR (somecolumn = @param1)) AND 
    ((@param2 IS NULL) OR (someothercolumn = @param2)) 


END 

[注:它可以有參數嗅探副作用,如果有很多參數...]

1
select * from thetable 
where (@name='' or [name][email protected]) and (@age=0 or [email protected]) 

但是,上面的查詢強制進行表掃描。爲了獲得更好的性能和更復雜的場景(我想你簡化了原始帖子中的問題),考慮使用動態sql。順便說一句,LINQ到SQL可以幫助您構建動態SQL很容易,像下面這樣:

IQueryable<Person> persons = db.Persons; 
if (!string.IsNullOrEmpty(name)) persons = persons.Where(p=>p.Name==name); 
if (age != 0) persons = persons.Where(p=>p.Age=age); 
+0

該查詢不應強制啓動表掃描。還要注意''和0與NULL不相同。 – TomTom 2010-05-05 04:15:28

+0

@TomTom:從理論上講,第一個查詢不一定會導致表掃描,但實際上它可以處理99.9%的情況,因爲查詢分析器會在查詢中看到很多值列。通常這些價值欄不適合指數。 – Codism 2012-11-14 17:21:30