SQL Server CASEの使い方 条件分岐

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の使い方とパターンでした。

コメント