ray88’s diary

お仕事で困ったとき用の自分用の覚書

SQL指南書 テーブル同士のマッチング(CASE文の応用)

SQL 指南書集 目次 - ray88’s diary
■ポイント
・DECODE式と比較するとCASE式は式を評価できることが利点
・CASE式の中でBETWEEN,LIKE,<,>といった便利な述語群が使用可能
・特にINとEXISTSはサブクエリを引数に取れる為、強力な表現力を持つ
・集約を行わないのでソートが発生しない
・月数が増えてもSELECT句を修正するだけで済む
・INとEXSISTSどちらも同じ結果だがパフォーマンスはEXISTSの方が良い
・表固定のクロス表にも応用可能


【IN述語を使用したサンプルコード】

-/* -テーブルマッチング:IN述語の利用(p.21) */
SELECT course_name,
	   CASE WHEN course_id IN
			(SELECT course_id FROM OpenCourses
			 WHERE month = 200706)THEN ''
			ELSE '×' END As "6月",
	   CASE WHEN course_id IN
	        (SELECT course_id FROM OpenCourses
			 WHERE month = 200707)THEN ''
			 ELSE '×' END AS "7月",
	   CASE WHEN course_id IN
	        (SELECT course_id FROM OpenCourses
			 WHERE month = 200708)THEN ''
			 ELSE '×' END AS "8月"
 FROM CourseMaster;		 

【EXISTS述語を利用したサンプルコード】

/* テーブルのマッチング:EXISTS 述語の利用(p.21) */
SELECT CM.course_name,
       CASE WHEN EXISTS
                    (SELECT course_id FROM OpenCourses OC
                      WHERE month = 200706
                        AND CM.course_id = OC.course_id) THEN ''
            ELSE '×' END AS "200706",
       CASE WHEN EXISTS
                    (SELECT course_id FROM OpenCourses OC
                      WHERE month = 200707
                        AND CM.course_id = OC.course_id) THEN ''
            ELSE '×' END AS "200707",
       CASE WHEN EXISTS
                    (SELECT course_id FROM OpenCourses OC
                      WHERE month = 200708
                        AND CM.course_id = OC.course_id) THEN ''
            ELSE '×' END  AS "200708"
  FROM CourseMaster CM;