0

这是我所拥有的一个片段:

select something from myTable
where curentFlag = 'Y'
and
case when @Year2 is not NULL then  
 AYEAR >= @Year AND AYEAR <= @Year2
else
 AYEAR= isnull(@Year ,AYEAR)  
end
        ADATE = ISNULL(@Date, ADATE) 

但这会产生:

'>' 附近的语法不正确。
'ADATE' 附近的语法不正确。

用户应该能够按年份(等于)或年份范围进行搜索。所以我要么只是传递,@YEAR要么两者都传递@YEARand @YEAR2。假设我的数据集:

DECLARE @y TABLE(AYEAR INT);
INSERT @y VALUES(2008),(2010),(2010);

现在我有这些变量:

DECLARE @YEAR INT, @YEAR2 INT;
  • 如果我通过,@YEAR = 2008我应该得到 1 个结果。
  • 如果我通过,@YEAR = 2010我应该得到 2 个结果。
  • 如果我通过,@YEAR = 2008@YEAR2 = 2010应该得到所有 3 个结果。
4

2 回答 2

3

CASE是一个返回单个值的表达式。它不能用于流逻辑的控制。

如果您确定它@Year总是会被填充并且@Year2只会有时会被填充,那么这个更简单的逻辑应该可以工作:

WHERE CURRENTFLAG = 'Y'
AND AYEAR BETWEEN @Year AND COALESCE(@Year2, @Year)
AND ADATE = COALESCE(@Date, ADATE);

你可以用一个非常简单的例子来试试:

DECLARE @y TABLE(AYEAR INT);
INSERT @y VALUES(2008),(2010),(2010);

DECLARE @YEAR INT = 2008, @YEAR2 INT = 2010;
--DECLARE @YEAR INT = 2008, @YEAR2 INT = NULL;
--DECLARE @YEAR INT = 2010, @YEAR2 INT = NULL;

SELECT AYEAR FROM @y 
  WHERE AYEAR BETWEEN @YEAR AND COALESCE(@YEAR2, @YEAR);
于 2013-01-29T20:42:40.050 回答
0
 where CURRENTFLAG = 'Y' 
    case when @Year2 is not NULL then  --after THEN should be statement or BEGIN block not AND
 and AYEAR >= @Year AND AYEAR <= @Year2
    else
     AND  AYEAR= isnull(@Year ,AYEAR)   -- here also
    end
        and    ADATE = ISNULL(@Date, ADATE) 
于 2013-01-29T20:44:14.413 回答