今回は、データベースのIF文を使う処理を、SQL Serverを使って実装してみようと思います。

SQLのIF文はSQL ServerやOracleやMySQLなど、使用するSQLの種類によって少し書き方が異なりますが、書き方を知っておくとストアドプロシージャーや複雑なクエリを書く必要がある時に役に立ちます。

SQL ServerのIF文の使い方

SQL ServerでIF文を使う例として、以下のクエリを考えてみます。

SQL ServerでIFを使ったクエリを書く場合は、IFの後にTHENは付かず、処理をBEGINとENDで囲みます。

DECLARE @a AS int;
DECLARE @b AS int;

SET @a = 5;
SET @b = 7;

IF @a % 3 = 1
BEGIN
    SELECT @a + @b;
END
ELSE IF @a % 3 = 2
BEGIN
    SELECT @a * @b;
END
ELSE
BEGIN
    SELECT @b - @a;
END

まず、このクエリは一体何をしているのかを説明します。

このクエリは、@a、@bという変数を定義して、@aの値を3で割った時に、余りが1であれば、@aと@bの値の和を求める。

余りが2であれば@aと@bの積の値を求める。

余りがなく割り切れる場合は、@bと@aの差を求める。

そんな処理となっています。


では、実際に上記のクエリを実行してみます。

@aの値を3で割ると余りが2なので、@aと@bの積が求められました。


次に、@aの値を4に書き換えてみます。

DECLARE @a AS int;
DECLARE @b AS int;

SET @a = 4;
SET @b = 7;

IF @a % 3 = 1
BEGIN
    SELECT @a + @b;
END
ELSE IF @a % 3 = 2
BEGIN
    SELECT @a * @b;
END
ELSE
BEGIN
    SELECT @b - @a;
END

この時の実行結果は以下のようになりました。

@aを3で割った余りが1になるので、最初のIF文のルートを通り、@aと@bの和を求めるルートに進みました。


最後に以下のように@aを6に設定してみます。

DECLARE @a AS int;
DECLARE @b AS int;

SET @a = 6;
SET @b = 7;

IF @a % 3 = 1
BEGIN
    SELECT @a + @b;
END
ELSE IF @a % 3 = 2
BEGIN
    SELECT @a * @b;
END
ELSE
BEGIN
    SELECT @b - @a;
END

この時の実行結果は以下のようになりました。

6は3で割り切れるので、最後のELSEのルートに入り、@bと@aの差を求めるルートに入りました。

SQL ServerのIF文内のBEGIN、ENDは処理が1行だけだったら省略できる

今まで扱ってきたクエリですが、IF文内の処理が1行だけであれば、BEGINとENDを省略することが出来ます。

なので、以下のように書き換えることも可能です。

DECLARE @a AS int;
DECLARE @b AS int;

SET @a = 5;
SET @b = 7;

IF @a % 3 = 1
    SELECT @a + @b;
ELSE IF @a % 3 = 2
    SELECT @a * @b;
ELSE
    SELECT @b - @a;

複雑なクエリやストアドプロシージャーであればIFの条件文内に記述する処理が複数存在することも少なくないので、省略するという書き方はそこまで需要が無いかもしれません。

例え1行で書けるルートがあっても、そこだけBEGIN、ENDを省略した形にすると、他のルートとの統一性がなくなるため、全てのルートの処理が1行で記述出来る時のみBEGIN、ENDを省略し、普段はBEGIN、ENDをしっかり記述するようなルールを作った方が良いかと思われます。

ただ、頭の片隅に処理が1行だけであればIF文のBEGIN、ENDを省略できるという考え方を残しておけば、他の人が書いたクエリやストアドプロシージャーを読む時に、「こんな書き方も出来たな」とスムーズに読むことが出来るため、知識として覚えておいて損することはないです。

まとめ

今回はSQL ServerでIF文をどう書くかを説明しました。

ポイントは以下の通りです。

  1. SQL ServerのIF文にはTHENは付かない
  2. ELSE IFの条件も普通に設定できる
  3. ELSEの条件も普通に設定できる
  4. IF文内では基本的にBEGIN、ENDを記述する必要があるが、処理が1行の場合のみ省略することが出来る
  5. 処理が空の条件は作成することが出来ない
  6. IF文の中にさらにIF文を入れる、いわゆる入れ子のIF文を書くことはなるべく避ける

⑤については、本文中で説明しませんでしたが、例えば以下のような書き方をするとエラーになります。

DECLARE @a AS int;
DECLARE @b AS int;

SET @a = 6;
SET @b = 7;

IF @a % 3 = 1
BEGIN
END
ELSE IF @a % 3 = 2
BEGIN
    SELECT @a * @b;
END
ELSE
BEGIN
    SELECT @b - @a;
END
GO

このことも結構忘れがちなので、覚えておきましょう。

空処理を入れているのが原因なのに、それ以外の原因を探そうとして時間を浪費するのはもったいないです。

どうしても空処理にしたければ、処理と無関係な変数を定義しておいて、そこに値を入れるなど工夫した方がいいでしょう。

今回の記事はここまでとなります。
また次の記事でお会いしましょう。