一連の条件を評価して、考えられる結果式のうちの 1 つを返します。
CASE 式には 2 つの形式があります。
-
単純 CASE 式では、1 つの式を一連の単純式と比較して結果を決定します。
-
検索 CASE 式では、一連のブール式を評価して結果を判定します。
どちらの形式も、ELSE 引数 (省略可) をサポートしています。
CASE は、有効な式を使用できる任意のステートメントや句で使用できます。たとえば、SELECT、UPDATE、DELETE、SET などのステートメントや、select_list、IN、WHERE、ORDER BY、HAVING などの句で使用できます。
Transact-SQL 構文表記規則

構文
Simple CASE expression:
CASE input_expression
WHEN when_expression THEN result_expression [ ...n ]
[ ELSE else_result_expression ]
END
Searched CASE expression:
CASE
WHEN Boolean_expression THEN result_expression [ ...n ]
[ ELSE else_result_expression ]
END

引数
-
input_expression
-
単純 CASE 形式を使用した場合に評価される式です。input_expression は、任意の有効な式です。
- WHEN when_expression
-
単純 CASE 形式を使用した場合に input_expression と比較される単純式です。when_expression は、任意の有効な式です。input_expression と各 when_expression のデータ型は同一であるか、暗黙的な変換によって同一の型になる必要があります。
- THEN result_expression
-
input_expression = when_expression が TRUE になるとき、または Boolean_expression が TRUE になるときに返される式です。result expression は任意の有効な式です。
- ELSE else_result_expression
-
比較操作の評価がいずれも TRUE でなかった場合に返される式です。この引数を省略し、比較操作のいずれも TRUE でなかった場合、CASE は NULL を返します。else_result_expression は任意の有効な式です。else_result_expression と任意の result_expression のデータ型は同一であるか、暗黙的な変換によって同一の型になる必要があります。
- WHEN Boolean_expression
-
検索 CASE 形式で評価するブール式です。Boolean_expression は任意の有効なブール式です。

戻り値の型
result_expressions およびオプションの else_result_expression の型のセットの中から、最も優先順位の高い型を返します。詳細については、「データ型の優先順位 (Transact-SQL)」を参照してください。
戻り値
単純 CASE 式 :
単純 CASE 式では、最初の式が各 WHEN 句の式と比較されて、等しいかどうかが確認されます。等しかった場合は、THEN 句の式が返されます。
-
実行できるのは、等しいかどうかのチェックだけです。
-
input_expression を評価し、次に指定の順序で各 WHEN 句の input_expression = when_expression を評価します。
-
TRUE と評価された最初の input_expression = when_expression の result_expression を返します。
-
input_expression = when_expression の評価がいずれも TRUE でなかった場合、SQL Server データベース エンジンは、ELSE 句が指定されていれば else_result_expression を、ELSE 句が指定されていない場合は NULL を返します。
検索 CASE 式 :
-
各 WHEN 句の Boolean_expression を指定の順序で評価します。
-
TRUE と評価された最初の Boolean_expression の result_expression を返します。
-
Boolean_expression の評価がいずれも TRUE でなかった場合、データベース エンジンは、ELSE 句が指定されていれば else_result_expression を、ELSE 句が指定されていない場合は NULL を返します。

解説
SQL Server では、Case 式に入れ子にできるのは 10 レベルまでです。
CASE 式を使用して、Transact-SQL ステートメント、ステートメント ブロック、ユーザー定義関数、およびストアド プロシージャの実行フローを制御することはできません。フロー制御の方法の一覧については、「流れ制御言語 (Transact-SQL)」を参照してください。

例
A. SELECT ステートメントを単純 CASE 式と共に使用する
SELECT ステートメント内では、単純 CASE 式は等しいかどうかのチェックだけを実行できます。これ以外の比較操作は実行できません。CASE 式を使用して、製品ラインのカテゴリの表示をわかりやすいものに変更する例を次に示します。
B. SELECT ステートメントを検索 CASE 式と共に使用する
SELECT ステートメント内では、検索 CASE 式は比較値に基づいて結果セット内で値を置換できます。次の例では、表示価格を、製品の価格範囲に基づいたテキスト コメントとして表示しています。
C. Microsoft Access で使用される IIf 関数を CASE で置き換える
CASE は、Microsoft Access の IIf 関数と同様の機能を提供します。次の例は、IIf を使用して、db1.ContactInfo という名前の Access テーブルの TelephoneInstructions 列に値を出力する簡単なクエリを示しています。
SELECT FirstName, LastName, TelephoneNumber,
IIf(IsNull(TelephoneInstructions),"Any time",
TelephoneInstructions) AS [When to Contact]
FROM db1.ContactInfo;
次の例では、CASE を使用して、AdventureWorks の Person.vAdditionalContactInfo ビューの TelephoneSpecialInstructions 列に値を出力します。
D. ORDER BY 句で CASE を使用する
次の例では、ORDER BY 句で CASE 式を使用して、指定された列の値に基づいて行の並べ替え順序を決定しています。最初の例では、HumanResources.Employee テーブルの SalariedFlag 列の値を評価します。SalariedFlag が 1 に設定されている従業員は EmployeeID の降順で、SalariedFlag が 0 に設定されている従業員は EmployeeID の昇順で返されます。2 番目の例では、列 CountryRegionName が 'United States' と等しい場合は結果セットが列 TerritoryName によって並べ替えられ、他のすべての列は CountryRegionName によって並べ替えられます。
E. UPDATE ステートメントで CASE を使用する
次の例では、UPDATE ステートメントで CASE 式を使用して、SalariedFlag が 0 に設定されている従業員の VacationHours 列の値を決定しています。VacationHours の値を 10 時間差し引くと値がマイナスになる場合は 40 時間、それ以外の場合は 20 時間、VacationHours の値を増やします。OUTPUT 句は、この処理の前後の VacationHours の値を表示するために使用されています。
F. SET ステートメントで CASE を使用する
次の例では、テーブル値関数 dbo.GetContactInfo の SET ステートメントで CASE 式を使用しています。AdventureWorks データベースでは、人に関連するデータはすべて Person.Contact テーブルに格納されています。たとえば、従業員、仕入先の代表者、小売り店の代表者、消費者などはすべて人に関連するデータとして扱われます。この関数は、指定した ContactID の氏名と連絡先タイプを返します。ContactType 列に表示される値は、SET ステートメント内の CASE 式により、Employee、StoreContact、VendorContact、または Individual (消費者) のどのテーブルに ContactID 列が含まれているかに基づいて決定されます。
G. HAVING 句で CASE を使用する
次の例では、HAVING 句で CASE 式を使用して、SELECT ステートメントで返される行を制限しています。このステートメントは、HumanResources.Employee テーブル内の各役職の最も高い時給を返します。HAVING 句では、最も高い時給が男性の場合には 40 ドル、女性の場合には 42 ドルを超えている役職のみが返されるように制限しています。

参照