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 の値] )

IIF 関数の使い方 0

[条件式] には、TRUE か FALSE になる、評価される条件式を指定します。TRUE・FALSE を返さない式を指定するとエラーになります。

[TRUE の値] には、[条件式] が TRUE の時に返す値を指定します。

[FALSE の値] には、[条件式] が TRUE ではない時に返す値を指定します。「FALSE の時は」でないことに注意してください。これについては後述します。


それでは、IIF 関数を使ってシンプルな条件分岐をしてみます。

次のような、StoreName(店舗名)、SalesDate(売上日)、SalesAmount(売上金額)が保存されている、Sales(売上)テーブルがあります。

SELECT  StoreName,
        SalesDate,
        SalesAmount
FROM    Sales;

[実行結果]
IIF 関数の使い方 1


これに、IIF 関数を使って SalesAmount が 1000 以上の時は、'Achieved'(目標達成)、そうでない時は 'NotAchieved' (目標達成ならず)という SalesGoalStatus というカラムを追加してみます。

SELECT  StoreName,
        SalesDate,
        SalesAmount,
        IIF(SalesAmount >= 1000, 'Achieved', 'NotAchieved') AS SalesGoalStatus
FROM    Sales;

[実行結果]
IIF 関数の使い方 2

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');

[実行結果]
IIF 関数の使い方 3

上の例では、条件式 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 関数の使い方 4


また、IIF 関数は次のような感じでネストできますが、CASE 式と同様に最大 10 回までしかネストできません。

SELECT  StoreName,
        SalesDate,
        SalesAmount,
        IIF(SalesAmount >= 1000, IIF(SalesAmount >= 1200, 'Achieved (Excellent)', 'Achieved'), 'NotAchieved') AS SalesGoalStatus
FROM    Sales;

[実行結果]
IIF 関数の使い方 5

条件文が複雑になる場合は、IIF 関数で書くと読みにくくなってしまうので、そういう時は CASE 式を使い、シンプルな時のみ IIF 関数を使うことをおすすめします。


以上、IIF 関数の基本的な使い方から、CASE 式との違い、実務で役立つ活用例などをご紹介しました。

© 2010-2025 SQL Server 入門