SQL Serverで条件分岐するには、「CASE」を使います。(他にはIIFもあります)CASEは応用がきき、非常に重要な構文になります。
CASEは
- 「値」で分岐する
- 「式」で分岐する
ことができます。
CASE(値で分岐)
--CASEで条件をわけてSELECTする SELECT CASE 列名 WHEN 値1 THEN 結果1 WHEN 値2 THEN 結果2 ELSE 結果3 END FROM table1;
これはCASEを使う一番シンプルなパターンです。値のみで分岐した結果を返します。あまり使用しないかもしれません。
CASE(条件式で分岐)
--CASEで条件をわけてSELECTする SELECT CASE WHEN 条件1 THEN 条件1の結果 WHEN 条件2 THEN 条件2の結果 ELSE 条件1,2以外の結果 END FROM table1;
こちらが式で分岐するCASEです。条件式を使う事ができるため幅が広がります。WHENのあとに条件をつけ、SELECTしたい結果をTHENのあとに記述し、ENDで終了です。
それでは、CASEを使う例をみていきます。
例1. CASE 条件分岐するパターン
--CASEで学級委員・書記だけマークする SELECT s_no, reader_f, CASE reader_f WHEN 1 THEN s_name || '/学級委員' WHEN 2 THEN s_name || '/書記' ELSE s_name END memo FROM student ORDER BY s_no;
s_no | reader_f | memo |
A001 | 0 | 青山学 |
A002 | 1 | 伊藤一/学級委員 |
A003 | 0 | 加藤太郎 |
A004 | 1 | 佐藤花子/学級委員 |
A005 | 2 | 田中律子/書記 |
このCASEでは学級委員の名前に「/学級委員」をつけて、書記の名前に「/書記」をつけてSELECTしています。これをCASEを使わずにWHERE句で条件分けしたとしたら結構面倒ですね。
例2. CASE 条件分岐をするパターン(式あり)
--CASEで学級委員だけマークする SELECT s_no, reader_f, CASE WHEN reader_f = 1 AND gender = '男' THEN s_name || '/男子学級委員' WHEN reader_f = 1 AND gender = '女' THEN s_name || '/女子学級委員' ELSE s_name END memo FROM student ORDER BY s_no;
s_no | reader_f | gender | memo |
A001 | 0 | 男 | 青山学 |
A002 | 1 | 男 | 伊藤一/男子学級委員 |
A003 | 0 | 男 | 加藤太郎 |
A004 | 1 | 女 | 佐藤花子/女子学級委員 |
A005 | 2 | 女 | 田中律子 |
条件分岐をCASE式にしています。式が使えるので複雑な分岐に対応できます。ここでは学級委員(reader_f = 1)で、かつ男女(gender)を区別して、その結果をコメント付きでSELECTしています。
例3. CASE 大小比較するパターン
--CASEで90点以上→A,70点以上→B,以外→CをSELECT SELECT s_no, s_name, CASE WHEN score >= 90 THEN 'A' WHEN score < 90 AND score >= 70 THEN 'B' ELSE 'C' END memo FROM student;
s_no | s_name | score | memo |
A001 | 青山学 | 80 | B |
A002 | 伊藤一 | 70 | B |
A003 | 加藤太郎 | 55 | C |
A004 | 佐藤花子 | 95 | A |
A005 | 田中律子 | 91 | A |
CASEでは大小比較ももちろんできます。ここではテストの点数で大小比較し、表示する記号をわけています。
例4. CASE ワイルドカードを使用するパターン
--CASEで佐藤さんは○、加藤さんは□をSELECT SELECT s_no, s_name, CASE WHEN s_name like '佐藤%' THEN '○' WHEN s_name like '加藤%' THEN '□' ELSE null END memo FROM student;
s_no | s_name | memo |
A001 | 青山学 | |
A002 | 伊藤一 | |
A003 | 加藤太郎 | □ |
A004 | 佐藤花子 | 〇 |
A005 | 田中律子 |
CASEではワイルドカードにも対応しています。このように、あいまい検索もできます。
例5. CASE 集計パターン
--CASEで男女の数をSELECT SELECT SUM(CASE WHEN gender = '男' THEN 1 ELSE 0 END) boy, SUM(CASE WHEN gender = '女' THEN 1 ELSE 0 END) girl FROM student;
boy | girl |
3 | 2 |
CASEで条件分岐して集計することもできます。男子、女子の人数をそれぞれ一度に集計しています。
男なら1、女なら1を返し、その数をSUMしています。where句でわけると複数のSQLに分かれて煩雑ですが、caseなら一発です。このようにCASEが使えるとSQLのコード量が大幅に省略できて楽になります。
参照:CASE の使用 – TechNet – Microsoft
以上、SQL ServerのCASEの使い方とパターンでした。
コメント