9

以下のように、複数の if ステートメント (約 100) を使用する T-SQL コードがあります。最初の IF ステートメント条件が TRUE と評価された場合でも、残りの 99 個のステートメントが評価されます。

IF(@check = 'abc') SET @var1 = @value
IF(@check = 'def') SET @var2 = @value
IF(@check = 'ghi') SET @var3 = @value
IF(@check = 'jkl') SET @var4 = @value
IF(@check = 'mno') SET @var5 = @value
…
…

これらを変換して CASE 式を使用したいと考えています。例えば

CASE @check
    WHEN 'abc' THEN SET @var1 = @value
    WHEN 'def' THEN SET @var2 = @value
    WHEN 'ghi' THEN SET @var3 = @value
    WHEN 'jkl' THEN SET @var4 = @value
    WHEN 'mno' THEN SET @var5 = @value
    …
    …
END

しかし、それができず、CASE 式内で SET を使用できないという SQL エラーが表示されます。

どうすればこれを達成できるか考えている人はいますか? ありがとう!

4

2 に答える 2

25

case ステートメントはそれをカットしません: CASE で SET を使用できる唯一の方法は、次のようにすることです。

SET @var = CASE @check
       WHEN 'abc' THEN @value
       [etc]
    END

...これは単一の変数しか設定できないため、うまくいきません。したがって、ELSEを使用する必要があります。つまり、次のようになります。

IF (@check = 'abc') SET @var1 = @value
ELSE IF (@check = 'def') SET @var2 = @value
ELSE IF (@check = 'ghi') SET @var3 = @value
ELSE IF (@check = 'jkl') SET @var4 = @value
ELSE IF (@check = 'mno') SET @var5 = @value
   [...]

ただし、100 の異なる変数を設定するこのような 100 の句がある場合、アプローチが間違っている可能性があるように思えます。一歩下がって、100 の個別の変数が必要な理由を自問します。コア テーブルまたは一時テーブルからの読み取りのいずれかで、セットベースのソリューションとして実行できるより良い方法があるかもしれません。ただし、あなたがやろうとしていることの詳細が必要です (小さいが完全に機能する例を使用)。

于 2013-10-10T16:38:05.967 に答える