当可选参数为null或为空时,如何忽略该条件? e.g。
declare @color nvarchar(50)
declare @time datetime
set @color = null
select *
from apples
where apple.color = @color
and apple.time = @time
如果@color或@time为null,我想忽略该条件。
答案 0 :(得分:5)
SELECT *
FROM apples
WHERE (@color IS NULL OR apples.color = @color)
AND (@time IS NULL OR apples.time = @time)
答案 1 :(得分:4)
对于人类读者来说,这样的事情似乎更受欢迎:
SELECT *
FROM apples
WHERE apple.color = COALESCE(@color, apple.color)
AND apple.time = COALESCE(@time, apple.time);
我理解一些优化器可以很好地处理这个问题。遗憾的是,SQL Server不是其中之一:上面将导致表扫描,以及主题的变化:(
Tony Rogerson SQL Server MVP对此做了some good analysis并得出结论:
SQL Server中获取的唯一方法 高效,可扩展且高效 解决方案是使用大量
IF ELSE
流量块控制(每个一个 参数组合)或使用动态 SQL。
因此,答案取决于您是否正在编写易于理解,维护和移植到其他SQL平台的代码,或者今天在一个优化器上运行良好。
答案 2 :(得分:2)
语法取决于您的确切RDBMS,但对于MySQL:
SELECT *
FROM apples
WHERE apple.color = IFNULL( @color, apple.color )
AND apple.time = IFNULL( @time, apple.time )
依此类推其他属性。
答案 3 :(得分:1)
您可以在每个条件中添加“或@param为空”。
select * from apples where (apple.color = @color or @color is null) and (apple.time = @time or @time is null)
另一种解决方案是动态生成SQL语句。
答案 4 :(得分:0)
试试这个:
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
答案 5 :(得分:0)
Select * from apples where apple.color like (ISNULL(@color,'%'))