T-SQL - IIF 関数の使い方と注意点:シンプルに条件分岐する方法
IIF 関数の使い方と注意点:シンプルに条件分岐する方法
T-SQL でプログラミングをしていると、ちょっとだけ条件分岐を書きたい時があります。
C# でしたら [条件文] ? [true の時] : [false の時] とインラインで書きたいような場面です。
T-SQL でそんな時に便利なのが、IIF 関数です。
この記事では、IIF 関数の基本的な使い方から、CASE 式との違い、実務で役立つ活用例などをご紹介します。
IIF 関数の基本的な使い方
SQL Server の IIF 関数は、シンプルな条件分岐のための関数です。
SQL Server 2012 以降で使用可能です。
IF 文とは違って、SELECT 文の中で使うことができます。
IIF 関数の基本的な構文は以下の通りです。
IIF ( [条件式], [TRUE の値], [FALSE の値] )
[条件式] には、TRUE か FALSE になる、評価される条件式を指定します。TRUE・FALSE を返さない式を指定するとエラーになります。
[TRUE の値] には、[条件式] が TRUE の時に返す値を指定します。
[FALSE の値] には、[条件式] が TRUE ではない時に返す値を指定します。「FALSE の時は」でないことに注意してください。これについては後述します。
それでは、IIF 関数を使ってシンプルな条件分岐をしてみます。
次のような、StoreName(店舗名)、SalesDate(売上日)、SalesAmount(売上金額)が保存されている、Sales(売上)テーブルがあります。
SELECT StoreName, SalesDate, SalesAmount FROM Sales;
[実行結果]
これに、IIF 関数を使って SalesAmount が 1000 以上の時は、'Achieved'(目標達成)、そうでない時は 'NotAchieved' (目標達成ならず)という SalesGoalStatus というカラムを追加してみます。
SELECT StoreName, SalesDate, SalesAmount, IIF(SalesAmount >= 1000, 'Achieved', 'NotAchieved') AS SalesGoalStatus FROM Sales;
[実行結果]
IIF 関数の条件式に、SalesAmount >= 1000 を指定し、TRUE の時は 'Achieved'、それ以外の場合は 'NotAchieved' を返すようにしています。
SalesGoalStatus には、SalesAmount が 1000 未満の 4 行目と 5 行目に 'NotAchieved'、それ以外には 'Achieved' が返っています。
IIF 関数の条件式の NULL の扱いについて
先ほど、基本構文の説明で、[FALSE の値] には、[条件式] が TRUE ではない時に返す値を指定しますと書きました。
条件文が FALSE の時に [FALSE の値] を返すわけではないことに注意してください。
これは、IIF 関数の条件式を評価した結果が UNKNOWN(NULL) だった場合も [FALSE の値] を返すためです。
実際に確認してみましょう。
SELECT IIF(1 = NULL, 'aaa', 'bbb');
[実行結果]
上の例では、条件式 1 = NULL は評価すると UNKNOWN になります。
ですので IIF 関数は 'bbb' を返しています。
IIF 関数と CASE 関数の違いとネストする際の注意点
IIF 関数は、CASE 式を簡単に記述するためのもので、実際には CASE 式に変換されます。
ですので、IIF 関数は CASE 式と同じ動きをしたり、同じ制限があります。
例えば、先ほどのこのクエリーは、下の CASE 式と同等です。
SELECT StoreName, SalesDate, SalesAmount, IIF(SalesAmount >= 1000, 'Achieved', 'NotAchieved') AS SalesGoalStatus FROM Sales;
SELECT StoreName, SalesDate, SalesAmount, CASE WHEN SalesAmount >= 1000 THEN 'Achieved' ELSE 'NotAchieved' END AS SalesGoalStatus FROM Sales;
[実行結果]
また、IIF 関数は次のような感じでネストできますが、CASE 式と同様に最大 10 回までしかネストできません。
SELECT StoreName, SalesDate, SalesAmount, IIF(SalesAmount >= 1000, IIF(SalesAmount >= 1200, 'Achieved (Excellent)', 'Achieved'), 'NotAchieved') AS SalesGoalStatus FROM Sales;
[実行結果]
条件文が複雑になる場合は、IIF 関数で書くと読みにくくなってしまうので、そういう時は CASE 式を使い、シンプルな時のみ IIF 関数を使うことをおすすめします。
以上、IIF 関数の基本的な使い方から、CASE 式との違い、実務で役立つ活用例などをご紹介しました。