条款在clausure在哪里

时间:2014-06-03 12:59:09

标签: sql sql-server tsql stored-procedures

在我的程序中我需要一个条件参数。

我知道clausure IF在WHERE上不起作用。有什么选择?

我的代码

CREATE PROCEDURE PROC1

 @DATA1 DATETIME, 
 @DATA2 DATETIME,
 @AGE INT = NULL

 AS 
 SELECT ID, DATA, NAME, AGE
 FROM TBL
 WHERE DATA BETWEEN @DATA1 AND @DATA2

 IF(@AGE <> IS NULL)
 AND AGE = @AGE

5 个答案:

答案 0 :(得分:0)

AND (@AGE IS NULL OR AGE = @AGE)

如果@AGE为null,那么它将始终返回TRUE。否则,AGE需要等于@AGE。

答案 1 :(得分:0)

一个简单的解决方案是

SELECT ID, DATA, NAME, AGE
 FROM TBL
 WHERE DATA BETWEEN @DATA1 AND @DATA2
AND (@AGE IS NULL OR AGE = @AGE)

答案 2 :(得分:0)

我建议你在这里使用CASE:

SELECT ID, DATA, NAME, AGE
 FROM TBL
 WHERE DATA BETWEEN @DATA1 AND @DATA2 and ISNULL( @AGE, 0) = 
   CASE 
      when @AGE IS NOT NULL 
        then AGE 
        else 0  
   end;

对于@AGE = NULL,最后一个条件将优化为0 = 0,它总是为TRUE,优化器执行计划会更好,因为不需要访问AGE表列。

答案 3 :(得分:0)

试试这个

CREATE PROCEDURE PROC1

 @DATA1 DATETIME, 
 @DATA2 DATETIME,
 @AGE INT = NULL

 AS 
 SELECT ID, DATA, NAME, AGE
 FROM TBL
 WHERE DATA BETWEEN @DATA1 AND @DATA2
    and (@AGE is null or @AGE = AGE)

答案 4 :(得分:0)

你真的不需要测试非null,因为如果它为空AGE = @ AGE将评估将评估为false,所以这样做:

 SELECT ID, DATA, NAME, AGE
 FROM TBL
 WHERE DATA BETWEEN @DATA1 AND @DATA2 AND AGE=@AGE