次のように、複数の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エラーが表示されます。
誰も私がこれを達成する方法を知っていますか?ありがとう!
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個の句がある場合は、アプローチが間違っているように思えます。セットベースのソリューションとして、コアテーブルまたは一時テーブルから読み取ることで、何か改善できることがあります。ただし、実行しようとしていることの詳細が必要になります(小規模ですが、完全に機能する例があります)。
クリスJの答えの修正として。ここで[〜#〜] multiple [〜#〜]を単一のif、else ifまたはelse内のパラメーターに設定する場合は、次の構文を使用します。
IF (@check = 'abc')
begin
SET @var1 = @value
SET @var2 = @value
end
ELSE IF (@check = 'def')
begin
SET @var1 = @value
SET @var2 = @value
end
ELSE IF (@check = 'ghi')
begin
SET @var1 = @value
SET @var2 = @value
end
ELSE IF (@check = 'jkl')
begin
SET @var1 = @value
SET @var2 = @value
end
ELSE IF (@check = 'mno')
begin
SET @var1 = @value
SET @var2 = @value
end
「begin」および「end」ステートメントの使用に注意してください。これらのキーワードは、ほとんどのプログラミング言語にある中括弧に類似しており、特定のステートメントで複数の行を指定できます。