在我的程序中我需要一个条件参数。
我知道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
答案 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