2012-01-05 107 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) - 这些有时可以使代码更简单,因为它们是为表处理(在你的情况,可能是空),你可以加入 - 加上不需要尴尬的分裂功能。