SQL Serverでプログラミングを行う際、条件分岐は欠かせない機能です。
ある値が特定の条件を満たすときだけ処理を実行したり、複数の条件を順番にチェックして異なる処理を行ったりすることで、より柔軟で強力なデータ操作が可能になります。
本記事では、初心者向けにSQL ServerのIF…ELSE IF…ELSEステートメントの基本を解説し、実際のコード例とともに学んでいきます。最後に理解度を確認する演習問題と解答例もご用意しましたので、ぜひチャレンジしてください。
IF…ELSEステートメントとは
IF…ELSEステートメントは、指定した条件が真(TRUE)か偽(FALSE)かを判定し、異なる処理を実行するための制御構造です。
- IF:条件が真のときに実行する処理
- ELSE IF:最初のIFが偽の場合、次の条件をチェックして真なら実行
- ELSE:上記いずれの条件も偽の場合に実行
これにより、単純な二分岐から複雑な多段階分岐まで表現できます。
基本構文
IF <条件式1>
BEGIN
-- 条件式1が真のときの処理
END
ELSE IF <条件式2>
BEGIN
-- 条件式2が真のときの処理
END
ELSE
BEGIN
-- 上記いずれの条件も偽のときの処理
END
- <条件式>:比較演算子(=, <>, <, >, <=, >=)や論理演算子(AND, OR, NOT)を組み合わせて記述
- BEGIN … END:複数行のステートメントをまとめる際に使用
ポイント
- ELSE IFは「ELSE と IF の組み合わせ」で、SQL Serverの文法上はELSEIFではなく必ずELSE IFと書きます。
- BEGIN … ENDは省略可能ですが、複数行を書く場合は必ず使いましょう。
複数条件の分岐(ELSE IF)
複数の条件を順に評価したい場合、ELSE IFを連続して記述します。最初に真と判定されたブロックだけが実行され、以降の条件はスキップされます。
DECLARE @score INT = 75;
IF @score >= 90
PRINT '優';
ELSE IF @score >= 80
PRINT '良';
ELSE IF @score >= 70
PRINT '可';
ELSE
PRINT '不可';
上記では、@scoreが90以上→「優」、80以上→「良」、70以上→「可」、それ未満→「不可」と出力されます。
実際の使用例
例1:数値判定
DECLARE @value INT = 5;
IF @value > 0
PRINT '正の数です';
ELSE IF @value = 0
PRINT 'ゼロです';
ELSE
PRINT '負の数です';
@valueが正、ゼロ、負のいずれかを判定します。
例2:文字列判定
DECLARE @status VARCHAR(10) = 'pending';
IF @status = 'approved'
PRINT '承認済み';
ELSE IF @status = 'pending'
PRINT '承認待ち';
ELSE IF @status = 'rejected'
PRINT '却下';
ELSE
PRINT '不明なステータス';
文字列を比較する際も=演算子を使用します。
例3:ストアドプロシージャ内での使用
CREATE PROCEDURE dbo.CheckInventory
@productId INT,
@quantity INT
AS
BEGIN
DECLARE @stock INT;
SELECT @stock = StockQuantity FROM Products WHERE ProductID = @productId;
IF @stock IS NULL
PRINT '該当商品が存在しません';
ELSE IF @stock >= @quantity
PRINT '在庫あり';
ELSE
PRINT '在庫不足';
END;
テーブルから取得した在庫数を条件判定し、存在チェックや在庫有無を出力します。
注意点とベストプラクティス
NULLの扱い
- 比較にNULLが混じると常にUNKNOWNとなり、IFでは偽扱いになります。
- IS NULL/IS NOT NULLで明示的に判定しましょう。
BEGIN…ENDの利用
- 複数行をまとめる際は必ずBEGIN…ENDで囲む。
- 可読性とメンテナンス性が向上します。
ネストの深さに注意
IFの入れ子が深くなると読みづらくなるため、複雑なロジックはストアドプロシージャや関数に切り出すことを検討。
コメントの活用
複数条件の意図や特殊な例外処理にはコメントを残し、将来の修正に備えましょう。
まとめ
- IF…ELSE IF…ELSEステートメントは、SQL Serverで条件分岐を実現する基本機能です。
- 比較演算子や論理演算子を駆使し、数値・文字列・NULLチェックなど多彩な判定が可能。
- ストアドプロシージャやバッチ処理内でのエラー処理や分岐ロジックに欠かせません。
- ベストプラクティスを守り、可読性・保守性の高いコードを書きましょう。
演習問題
以下のシナリオに対して、IF…ELSE IF…ELSEステートメントを使ったT-SQLコードを作成してください。
- 問題1:偶数・奇数判定
変数@nの値が偶数なら「Even」、奇数なら「Odd」と出力する。 - 問題2:成績評価
変数@scoreに応じて以下の文字列を出力する。- 90点以上 → ‘A’
- 80点以上 → ‘B’
- 70点以上 → ‘C’
- 60点以上 → ‘D’
- それ未満 → ‘F’
- 問題3:在庫アラート
テーブルInventory(ProductID INT, Stock INT)がある。変数@productIdと@orderQtyを受け取り、以下の判定を行うストアドプロシージャを作成する。- 商品が存在しない → ‘Product not found’
- 在庫 ≥ 注文数 → ‘Order can be fulfilled’
- 在庫 < 注文数 → ‘Insufficient stock’
解答例
解答例1:偶数・奇数判定
DECLARE @n INT = 7;
IF @n % 2 = 0
PRINT 'Even';
ELSE
PRINT 'Odd';
解答例2:成績評価
DECLARE @score INT = 85;
IF @score >= 90
PRINT 'A';
ELSE IF @score >= 80
PRINT 'B';
ELSE IF @score >= 70
PRINT 'C';
ELSE IF @score >= 60
PRINT 'D';
ELSE
PRINT 'F';
解答例3:在庫アラート(ストアドプロシージャ)
CREATE PROCEDURE dbo.CheckOrder
@productId INT,
@orderQty INT
AS
BEGIN
DECLARE @stock INT;
SELECT @stock = Stock FROM Inventory WHERE ProductID = @productId;
IF @stock IS NULL
PRINT 'Product not found';
ELSE IF @stock >= @orderQty
PRINT 'Order can be fulfilled';
ELSE
PRINT 'Insufficient stock';
END;