2012-01-05 91 views
1

編寫一個具有多個輸入參數的存儲過程。參數可能並不總是有值,可能是空的。但由於存在每個參數可能包含值的可能性,所以我必須包含在查詢中使用這些參數的標準。Sql Server IN子句問題

我的查詢看起來是這樣的:

SELECT DISTINCT COUNT(*) AS SRM 
FROM table p 
WHERE p.gender IN (SELECT * FROM Fn_SplitParms(@gender)) AND 
p.ethnicity IN (SELECT * FROM Fn_SplitParms(@race)) AND 
p.marital_status IN (SELECT * FROM Fn_SplitParms(@maritalstatus)) 

所以我的問題是,如果@gender是空的(」「)查詢將返回數據,其中性別字段爲空時,我真的想忽略頁。性別在一起。我不想用IF/ELSE條件語句來完成這個任務,因爲它們太多了。

在這種情況下,有什麼辦法可以使用IN的CASE嗎? OR 有沒有其他的邏輯,我只是​​不理解,將解決這個問題?

無法找到適合的產品...

謝謝!

+1

注意:構建單個查詢來完成此操作通常會產生可怕的執行計劃。下面的文章是非常深入的,但強調DynamicSQL產生迄今爲止最有效的動態搜索。 http://www.sommarskog.se/dyn-search.html – MatBailie 2012-01-05 17:33:34

回答

2

使用or

SELECT DISTINCT COUNT(*) AS SRM 
FROM table p 
WHERE 
(p.gender IN (SELECT * FROM Fn_SplitParms(@gender)) OR @gender = '') 
AND (p.ethnicity IN (SELECT * FROM Fn_SplitParms(@race)) OR @race = '') 
AND (p.marital_status IN (SELECT * FROM Fn_SplitParms(@maritalstatus)) OR @maritalstatus = '') 
+0

啊,比我做得更簡單......謝謝! – Encryption 2012-01-05 17:35:15

0

您可能還需要考慮表值參數(if using SQL Server 2008 and up) - 這些有時可以使代碼更簡單,因爲它們是爲表處理(在你的情況,可能是空),你可以加入 - 加上不需要尷尬的分裂功能。