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 テーブルがあります。

T-SQL - CASE の使い方 1


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;

[ 実行結果 ]
T-SQL - CASE の使い方 2

単純 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;

[ 実行結果 ]
T-SQL - CASE の使い方 3

TestResult テーブルに StudentID が存在しない StudentID = 6 だけが 0 になりましたね。


CASE 式はネストもできます。 そんなにしないと思いますが、上限は最大 10 レベルまでです。

T-SQL - CASE の使い方 4

© 2010-2024 SQL Server 入門