SQL Serverにおいて、条件に応じて異なる値を返す場合、昔は CASE WHEN
文を使うのが一般的でした。
しかし、SQL Server 2012以降では IIF()
関数が導入され、他の言語の if
に近い構文で記述できるようになっています。
ただし、他のDB(MySQLやPostgreSQLなど)では IIF
は使えません。そのため、将来的に他のDBMSに載せ替える可能性がある場合は、互換性のある CASE
を使う方が無難です。
IIF関数の基本構文と使い方
単純な条件分岐
IIF( 条件, 真のときの値, 偽のときの値 )
パラメータは、条件、Trueの場合の戻り値、Falseの場合の戻り値の3つです。
今回は点数が60点以上を合格、60点未満を不合格と返す命令をサンプルとします。
条件式 | 点数>=60 |
---|---|
Trueの戻り値 | 合格 |
Falseの戻り値 | 不合格 |
SELECT IIF(点数 >= 60, '合格', '不合格') AS 判定 FROM テスト結果TBL;
ネスト(入れ子)による複数条件
条件が増えればIIFをネストして記述すること可能です。
SELECT
IIF(点数 >= 60, '合格',
IIF(点数 >= 30, '赤点', '青点')
) AS 判定
FROM テスト結果TBL;
このサンプルでは60点以上が【合格】、30点以上60点未満が【赤点】、30点未満は【青点】を返します。
※どこかの学校の点数評価ですね(笑)
CASE文との違いと使い分け
SQL標準との互換性
IIF
は SQL Server 特有の関数です。PostgreSQL、MySQL、Oracle では使用できません。一方、CASE
はSQL標準であり、すべてのDBMSで使える構文です。
条件数と可読性の観点
- 条件が2つだけなら
IIF
で十分。 - 条件が3つ以上ある場合や
NULL
判定を含むときは、可読性の高いCASE
を推奨します。
SELECT
CASE
WHEN 点数 >= 60 THEN '合格'
WHEN 点数 >= 30 THEN '赤点'
ELSE '青点'
END AS 判定
FROM テスト結果TBL;
IIF関数の注意点(バージョン制限など)
- SQL Server 2012以降でのみ利用可能。
- NULLに絡む評価順によっては意図しない結果を返すことがある。
CASE
に比べて柔軟性がやや低い。
まとめ|SQL Serverでの条件分岐の使い分け
SQL ServerのSELECT文内で処理を分岐する方法として、IIFとCASE WHENをご紹介しました。
元々SQL ServerではIF文は使えませんでしたが、Ver2012からIIF文として利用できるようになりました。
逆に言えば、Ver2012より前の場合は使えませんし他のDBMSのSQL構文との互換性もありません。
条件が少ない場合IF文の方が使いやすいとは思いますが、CASE文で代替できる処理はCASE文で書いておいた方が後々困ることがないように思います。
コメント