当proc为null时,stored proc返回所有行

时间:2009-11-04 00:44:51

标签: sql sql-server tsql stored-procedures

当可选参数为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,我想忽略该条件。

6 个答案:

答案 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,'%'))