T-SQL - CASE の使い方
T-SQL の CASE の使い方
今回は T-SQL でクエリーやプロシージャを書くのによく出てくる、CASE の使い方に注目してみましょう。
これらのテーブルを使いますので、こちら のスクリプトを実行して、Student・Test・TestResult テーブルを生成しておいてください。
CASE 式
CASE は WHEN リストした条件を上から順番にチェックしていき、最初に TRUE となる条件の結果を返します。
どれも合致せず、ELSE が指定されている場合は ELSE の結果を返します。
どれも合致せず、ELSE が指定されていない場合は NULL を返します。
CASE の構文には単純 CASE 式と検索 CASE 式の2 種類あります。
単純 CASE 式の構文は以下の通りです。
CASE input_expression WHEN when_expression1 THEN result_expression1 WHEN when_expression2 THEN result_expression2 WHEN when_expression3 THEN result_expression3 ... [ ELSE else_result_expression ] END
上から見ていって、最初に input_expression と when_expression がマッチする result_expression を返します。
個人的には、単純 CASE 式と同等のことが検索 CASE 式でできるので、検索 CASE 式だけ覚えておけば良いと思っています。
検索 CASE 式の構文は以下の通りです。
CASE WHEN boolean_expression1 THEN result_expression1 WHEN boolean_expression2 THEN result_expression2 WHEN boolean_expression3 THEN result_expression3 ... [ ELSE else_result_expression ] END
上から見ていって、最初に boolean_expression が TRUE になる result_expression を返します。
それでは実際に CASE 式を使ってみましょう。
次のような Student テーブルと TestResult テーブルがあります。
Student テーブルの SELECT 文に Gender が M の時は 「 男 」、F の時は 「 女 」、それ以外は 「 不明 」 という値を持つ [性別] というカラムを追加してみましょう。
SELECT *, ----------------------- -- 単純 CASE 式 CASE Gender WHEN 'M' THEN N'男' WHEN 'F' THEN N'女' ELSE N'不明' END AS [性別1], ----------------------- -- 検索 CASE 式 CASE WHEN Gender = 'M' THEN N'男' WHEN Gender = 'F' THEN N'女' ELSE N'不明' END AS [性別2] FROM Student;
[ 実行結果 ]
単純 CASE 式と検索 CASE 式の両方を使って性別を取得してみました。
次は Student テーブルの SELECT 文に、TestResult テーブルにその学生のレコードが存在する場合は 1 それ以外は 0 を値として持つ、[テスト済フラグ] というカラムを追加してみましょう。
SELECT *, CASE WHEN EXISTS (SELECT * FROM TestResult AS TR WHERE TR.StudentID = S.StudentID) THEN 1 ELSE 0 END AS [テスト済フラグ] FROM Student AS S;
[ 実行結果 ]
TestResult テーブルに StudentID が存在しない StudentID = 6 だけが 0 になりましたね。
CASE 式はネストもできます。 そんなにしないと思いますが、上限は最大 10 レベルまでです。