当参数为空时,存储过程返回所有行
当可选参数为空或空时,我该如何忽略该条件? 例如当参数为空时,存储过程返回所有行
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
语法取决于你的具体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语句。
感谢您的答复生成动态SQL不是DBA的偏好:( – sam 2009-11-04 02:36:52
@sam:让你的DBA来比较的执行计划“或NULL”构建(表扫描)和动态SQL(使用索引) – onedaywhen 2009-11-04 09:36:29
我真的很喜欢这种方法;好主意! – 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,'%'))
你能解释一下吗? – 2014-11-13 15:54:01
感谢它的工作 – sam 2009-11-04 02:31:33