ray88’s diary

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

SQL CASE演算子(条件によって値を変更する)

■書式
Case文には単純Case式と検索Case式がある。
単純Case式のほうが簡潔に書けるが、できることも限られている。
単純Case式で書ける条件は検索Case式でも書くことができる
以下のCASE式はどちらも同じ結果が出る

--単純CASE式
CASE sex
  WHEN '1' THEN ''
  WHEN '2' THEN ''
 ELSE 'その他' END

--検索CASE式
CASE WHEN sex = '1' THEN ''
            WHEN sex = '2' THNE ''
ELSE 'その他' END 

■CASE式の注意点
①CASE式の評価は真になるWHEN句が見つかった時点で打ち切られて
 残りのWHEN句は無視されるため、そのことを意識してコーディングする必要がある

--(例)以下のコードでは結果には「2番」が現れない
CASE WHEN col_1 IN('a','b') THEN '1番'
         WHEN col_2 IN('a')      THEN '2番’
ELSE ’その他' END

②各分岐が返すデータ型を統一する
③ENDの書き忘れに注意する
ELSE句は必ず記述する
 ENDと違い、ELSE句はオプションのため記述しなくてもエラーにはならない。
 しかし、記述しない場合は暗黙に「ELSE NULL」の扱いになるため、
 エラーにならなくても結果が違うバグの温床になるため、NULLで構わない場合であっても
 明示的にELSE句を記述する癖をつけること。
■サンプルコード①

SELECT
	CONCAT(l_name,f_name) AS 氏名
	,class AS 役職
	,CASE
		WHEN class IN ('部長','課長')
		THEN '管理職'
		WHEN class IN ('主任','担当')
		THEN '総合職'
		ELSE '一般職'
	END AS 役職クラス
FROM
	employee
;

出力結果

■サンプルコード②

SELECT
	name AS 氏名
	,CASE
		answer1
		WHEN 3
		THEN 'ためになった'
		WHEN 2
		THEN '普通'
		WHEN 1
		THEN '役に立たない'
		ELSE ''
	END AS 評価
	,answer2 AS 感想
	,FORMAT(answered,'yyyy年MM月dd日') AS 回答日時
FROM
	quest
ORDER BY
	answered DESC
;

出力結果

SELECT
	author_id AS 著者名
	,COUNT(isbn) AS カウント数
	,CASE
		WHEN COUNT(*) >= 4
		THEN '多い'
		WHEN COUNT(*) >= 2
		THEN '普通'
		ELSE '少ない'
	END AS 評価
FROM
	author_books
GROUP BY
	author_id
;

出力結果