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または両方@YEARを渡してい@YEAR2ます。それでは、私のデータセットを考えてみましょう:

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

今、私はこれらの変数を持っています:

DECLARE @YEAR INT, @YEAR2 INT;
  • 合格した場合@YEAR = 2008、1 つの結果が得られるはずです。
  • 合格した場合@YEAR = 2010、2 つの結果が得られるはずです。
  • 合格した場合、3 つの結果すべてを取得する必要があります@YEAR = 2008@YEAR2 = 2010
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 に答える