CASE
【環境】
MySQL:5.5.27, 5.5.38
MySQL:5.5.27, 5.5.38
MySQL:13.6.5.1 CASE Syntax
書式
THEN の後ろの値が戻ってくる。
値
- CASE case_value
- WHEN when_value THEN statement_list
- [WHEN when_value THEN statement_list] ...
- [ELSE statement_list]
- END CASE
- // 例
- CASE sex
- WHEN 1 THEN '男'
- WHEN 2 THEN '女'
- ELSE 'その他'
- END
条件式
- CASE
- WHEN search_condition THEN statement_list
- [WHEN search_condition THEN statement_list] ...
- [ELSE statement_list]
- END CASE
- // 例
- CASE
- WHEN sex = 1 THEN '男'
- WHEN sex = 2 THEN '女'
- ELSE 'その他'
- END
- // 不等号はもちろん、IN 句も使える
- CASE
- WHEN age IN (13, 14, 15) THEN '中学生'
- WHEN age IN (16, 17, 18) THEN '高校生'
- ELSE 'その他'
- END
利用
SELECT
散らばった値を集約して表示できる。
点数に応じて振り分け
80点を超えた人は合格。
60点を超えた人は再テスト。
それ以外の人は不合格。
- SELECT
- name, result,
- CASE
- WHEN result > 80 THEN 'Pass'
- WHEN result > 60 THEN 'ReTest'
- ELSE 'Fail'
- END as judgment
- FROM test;
集約関数併用
- SELECT dept_nbr,
- COUNT(CASE WHEN sex = 1 THEN 1 ELSE 0 END), // 男の人数
- COUNT(CASE WHEN sex = 2 THEN 1 ELSE 0 END) // 女の人数
- FROM Table_A
- GROUP BY dept_nbr;
GROUP BY
散らばった値を集約できる。
ただし、SELECT にも同内容の指定をすること。
豪快に GROUP BY句にも SELECT句の CASE式をコピーしてやるのがポイントです。
単純に「GROUP BY pre_name」と変換前の列を指定すると、
正しい結果が得られませんので注意してください。ミックのページ:CASE式のススメ
ORDER BY
任意のソート順を設定できる。
CHECK 制約との併用
CASE式は CHECK制約と非常に相性が良いのです。
実際に CASE式を使う局面の半分は CHECK制約の中ではないかと思うほどです。ミックのページ:CASE式のススメ
と、あるけど、まだ理解できていない。
複数カラムの最大値を返す
ミックのページ:CASE式のススメ 参照。
参考サイト
DBOnline:カラムの値に応じて異なる結果を返す条件式の記述
サンプルコードによるPerl入門:SQLのhaving句はcase式で書くと直感的に記述できる(2011-04-13)
DN-Web64:MySQL : CASE文で複雑な条件を指定
→簡潔で読みやすい。SELECT, GROUP BY, ORDER BY 別にサンプルあり
ミックのページ:CASE式のススメ
→いつもお世話になっております。相変わらずの詳細な解説をありがとうございます。