当参数为空时,存储过程返回所有行

问题描述:

当可选参数为空或空时,我该如何忽略该条件? 例如当参数为空时,存储过程返回所有行

declare @color nvarchar(50) 
declare @time datetime 

set @color = null 

select * 
    from apples 
where apple.color = @color 
    and apple.time = @time 

如果@color或@time为空,我想忽略该条件。

试试这个:

select * 
from apples 
where 1 = Case 
      When @color is null then 1 
      else 
      Case 
       When apple.color = @color then 1 
       else 0 
      end 
      end 
    and 1 = Case 
      When @time is null then 1 
      else 
       Case 
       When apple.time = @time Then 1 
       else 0 
       end 
      end 
+0

感谢它的工作 – sam 2009-11-04 02:31:33

语法取决于你的具体RDBMS,但对MySQL:

SELECT * 
FROM apples 
WHERE apple.color = IFNULL(@color, apple.color) 
AND apple.time = IFNULL(@time, apple.time) 

等其他属性。

SELECT * 
FROM apples 
WHERE (@color IS NULL OR apples.color = @color) 
    AND (@time IS NULL OR apples.time = @time) 

您可以简单地添加 “或@参数为空” 每个条件。

select * from apples where (apple.color = @color or @color is null) and (apple.time = @time or @time is null) 

另一种解决方案是动态生成SQL语句。

+0

感谢您的答复生成动态SQL不是DBA的偏好:( – sam 2009-11-04 02:36:52

+1

@sam:让你的DBA来比较的执行计划“或NULL”构建(表扫描)和动态SQL(使用索引) – onedaywhen 2009-11-04 09:36:29

+0

我真的很喜欢这种方法;好主意! – 2010-01-26 05:17:15

对于人类读者,这样的事情似乎是首选:

SELECT * 
    FROM apples 
WHERE apple.color = COALESCE(@color, apple.color) 
     AND apple.time = COALESCE(@time, apple.time); 

而且据我所知,一些优化处理这个非常好。可悲的是,SQL Server的是不是其中之一:以上将导致表扫描,作为主题:(

托尼·罗杰森SQL服务器MVP对这个做了some good analysis并断定不会变化:

的仅在SQL Server ...的方式来获得一个 高效,可扩展性和高性能 溶液是要么使用IF ELSE控制流程块(每 参数的组合的一个),或使用动态 SQL的一吨。

因此,答案取决于您是编写易于理解的代码,将来如何维护并移植到其他SQL平台,或者今天在一个优化器上执行得如何。

Select * from apples where apple.color like (ISNULL(@color,'%')) 
+2

你能解释一下吗? – 2014-11-13 15:54:01