IF文による条件分岐でSQLを動的に変化させるさらっと覚えるSQL&T-SQL入門(10)(2/3 ページ)

» 2007年12月04日 00時00分 公開
[石橋潤一株式会社システムインテグレータ]

高度なIF文の利用

 続いてもう少し高度なIF文の利用を取り上げます。先ほどのサンプルでは、条件式に基づいて実行する命令文が1つだけでしたが、複数の命令を実行することも可能です。しかし、IF文では、単純に命令文を記述した場合は1つの命令文しか実行しません。次の例を見てみましょう。

CREATE PROCEDURE uspSamle3
  @Color varchar(50)
AS
 IF @Color IS NULL

  PRINT N'パラメータがNULLです'

 ELSE

  SELECT ProductID, Name, Color
    FROM Production.Product
    WHERE Color = @Color

  PRINT N'パラメータがNULL以外です'

 一見すると、それぞれの条件式に従ってメッセージを返しているように見えます。しかし、実際にストアドプロシージャを実行してみると次のような結果となります。

EXEC uspSamle3 NULL

結果
パラメータがNULLです
パラメータがNULL以外です

 このように、条件式で分かれているはずの命令文が実行されてしまいます。これはIF文が命令文を1つしか条件式として取り扱っていないことに起因します。このような問題を解決するために、「BEGIN…END」構文を利用します。BEGIN…END構文は、命令文をブロック化しひとまとめにできます。IF文で利用する場合、次のような構文となります。

IF 条件式

 BEGIN

     条件式がTRUEの場合に実行する命令文

 END

ELSE

 BEGIN

     条件式がFALSEの場合に実行する命令文

 END


 それでは、uspSamle3をBEGIN…END構文を利用して想定したとおりに動くように直しましょう。

ALTER PROCEDURE uspSamle3
  @Color varchar(50)
AS
BEGIN
 IF @Color IS NULL
  BEGIN

    PRINT N'パラメータがNULLです'

  END
 ELSE
  BEGIN

    SELECT ProductID, Name, Color
      FROM Production.Product
      WHERE Color = @Color

    PRINT N'パラメータがNULL以外です'

  END
END

 ストアドプロシージャ全体をBEGIN…ENDでブロック化するとともに、IF文の中に埋め込んだ条件式に対してもBEGIN…ENDを指定しています。実行結果は次のようになります。

EXEC uspSamle3 NULL

結果
パラメータがNULLです

 BEGIN…END構文の利用によって、意図したとおりの動きになっていることが分かります。このようにIF文で複数の命令文を記述する場合、例のようにBEGIN…ENDを正しく利用する必要があります。

Copyright © ITmedia, Inc. All Rights Reserved.

RSSについて

アイティメディアIDについて

メールマガジン登録

@ITのメールマガジンは、 もちろん、すべて無料です。ぜひメールマガジンをご購読ください。