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;