web-dev-qa-db-ja.com

SQL CASE式-ローカル変数の値の設定

次のように、複数の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エラーが表示されます。

誰も私がこれを達成する方法を知っていますか?ありがとう!

8
user2867911

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個の句がある場合は、アプローチが間違っているように思えます。セットベースのソリューションとして、コアテーブルまたは一時テーブルから読み取ることで、何か改善できることがあります。ただし、実行しようとしていることの詳細が必要になります(小規模ですが、完全に機能する例があります)。

23
Chris J

クリス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」ステートメントの使用に注意してください。これらのキーワードは、ほとんどのプログラミング言語にある中括弧に類似しており、特定のステートメントで複数の行を指定できます。

3
robopim