SQLServer CASE文 条件分岐

SQLServerのCASE文について紹介していきます。
CASE文は、SQLでIF文をつかえるようなイメージで、とても重宝しますので、使いこなせるようにしていきましょう。

使用するテーブル

SELECT * FROM hironimoTable

id   |nickName|animal|height
-----+--------+------+------
00001|ひろにも|きりん|150
00002|ひろにも|きりん|160
00003|ひろにも|きりん|170
00004|ひろにも|きりん|180
00005|ひろにも|きりん|190
00006|たなか  |いぬ  |100
00007|たなか  |いぬ  |120
00008|すずき  |ねこ  |120
00009|すずき  |ねこ  |130
00010|すずき  |ぞう  |140
00011|すずき  |ぞう  |150
00012|さとう  |ぞう  |150
00013|さとう  |ぞう  |160
00014|さとう  |きりん|170
00015|さとう  |きりん|180

 

CASE文の使い方

項目を固定した条件分岐の書き方

条件分岐をさせたい項目を固定したい時は、下記のように記載することができます。

SELECT
  CASE 項目 
    WHEN 値 THEN 任意の値
    WHEN 値 THEN 任意の値 
    ELSE 任意の値
  END
FROM
  テーブル名

 

条件分岐の書き方

もう一つの書き方を紹介しておきます。
こちらは、条件ごとに項目を変えることができます。

SELECT
  CASE 
    WHEN 項目 = 値 THEN 任意の値
    WHEN 項目 = 値 THEN 任意の値
    ELSE 任意の値
  END
FROM
  テーブル名

 

CASE文の例

項目を固定した条件分岐の例

animal項目が「きりんの時:1」「いぬの時:2」「それ以外の場合:3」と表示されるようにCASE文を作りました。

SELECT
  id
 ,nickName
 ,animal
 , CASE animal
    WHEN 'きりん' THEN 1
    WHEN 'いぬ' THEN 2
    ELSE 3
  END AS result
FROM
  hironimoTable

結果
id   |nickName|animal|result
-----+--------+------+------
00001|ひろにも|きりん|1
00002|ひろにも|きりん|1
00003|ひろにも|きりん|1
00004|ひろにも|きりん|1
00005|ひろにも|きりん|1
00006|たなか  |いぬ  |2
00007|たなか  |いぬ  |2
00008|すずき  |ねこ  |3
00009|すずき  |ねこ  |3
00010|すずき  |ぞう  |3
00011|すずき  |ぞう  |3
00012|さとう  |ぞう  |3
00013|さとう  |ぞう  |3
00014|さとう  |きりん|1
00015|さとう  |きりん|1

 

resultの値は、1,2,3の値が想定通り出力されていますね。

条件分岐の例

先ほどの条件に「heightが150の時:150」を追加しました。項目が1つじゃない場合は、このように書くことができます。

SELECT
  id
 ,nickName
 ,animal
 ,height
 , CASE
     WHEN animal = 'きりん' THEN 1
     WHEN animal = 'いぬ' THEN 2
     WHEN height = 150 THEN 150
    ELSE 3
  END AS result
FROM
  hironimoTable

結果
id   |nickName|animal|height|result
-----+--------+------+------+------
00001|ひろにも|きりん|150   |1
00002|ひろにも|きりん|160   |1
00003|ひろにも|きりん|170   |1
00004|ひろにも|きりん|180   |1
00005|ひろにも|きりん|150   |1
00006|たなか  |いぬ  |100   |2
00007|たなか  |いぬ  |120   |2
00008|すずき  |ねこ  |120   |3
00009|すずき  |ねこ  |130   |3
00010|すずき  |ぞう  |140   |3
00011|すずき  |ぞう  |150   |150
00012|さとう  |ぞう  |150   |150
00013|さとう  |ぞう  |160   |3
00014|さとう  |きりん|170   |1
00015|さとう  |きりん|180   |1

 

CASE文の応用

ここからは、CASE文の少し便利な使い方を紹介していきます。
状況に応じて参考にしてみてください。

CASE文の複数条件 書き方

CASE WHEN の条件は、AND,ORで複数繋げることもできます。

SELECT
  id
 ,nickName
 ,animal
 ,height
 , CASE
     WHEN height <= 160 AND height >= 150 THEN 160
     ELSE 0
  END AS result
FROM
  hironimoTable

結果
id   |nickName|animal|height|result
-----+--------+------+------+------
00001|ひろにも|きりん|150   |160
00002|ひろにも|きりん|160   |160
00003|ひろにも|きりん|170   |0
00004|ひろにも|きりん|180   |0
00005|ひろにも|きりん|150   |160
00006|たなか  |いぬ  |100   |0
00007|たなか  |いぬ  |120   |0
00008|すずき  |ねこ  |120   |0
00009|すずき  |ねこ  |130   |0
00010|すずき  |ぞう  |140   |0
00011|すずき  |ぞう  |150   |160
00012|さとう  |ぞう  |150   |160
00013|さとう  |ぞう  |160   |160
00014|さとう  |きりん|170   |0
00015|さとう  |きりん|180   |0

 

heightが150~160のデータのresultが160になっていることが確認できました。

集約関数と組み合わせる

SUMと組み合わせることで、条件ごとの集約した数を取得することができます。

SELECT
  SUM(CASE
     WHEN height <= 160 THEN 1
     ELSE 0
  END) AS result1
 ,SUM(CASE
     WHEN height >160 AND height <=170 THEN 1
     ELSE 0
  END) AS result2
 ,SUM(CASE
     WHEN height > 170 THEN 1
     ELSE 0
  END) AS result3
 
FROM
  hironimoTable


結果
result1|result2|result3
-------+-------+-------
11     |2      |2

 

SUMを使うことで、様々な条件での件数が取得できます。
今回の例では、
160以下の場合、11件
160より大きく170以下の場合、2件
170より大きい場合、2件
という情報を取得することができました。

UPDATE文で利用

UPDATE文でもCASE文を利用することができます。

UPDATE hironimoTable SET
  height = 
    CASE
      WHEN animal = 'きりん' THEN 200
      WHEN animal = 'いぬ' THEN 70
      ELSE 100
    END

結果
id   |nickName|animal|height
-----+--------+------+------
00001|ひろにも|きりん|200
00002|ひろにも|きりん|200
00003|ひろにも|きりん|200
00004|ひろにも|きりん|200
00005|ひろにも|きりん|200
00006|たなか  |いぬ  |70
00007|たなか  |いぬ  |70
00008|すずき  |ねこ  |100
00009|すずき  |ねこ  |100
00010|すずき  |ぞう  |100
00011|すずき  |ぞう  |100
00012|さとう  |ぞう  |100
00013|さとう  |ぞう  |100
00014|さとう  |きりん|200
00015|さとう  |きりん|200

 

きりん:200
いぬ:70
それ以外:100
に更新されていることが確認できました。

 

ORDER BYと組み合わせる

SELECT CASEをORDER BYに記載することで、任意の並び順を作ることができます。
以前紹介しているのでこちらも参考にしてみてください。

 

まとめ

CASE文はSQLで条件分岐ができるので、とても便利です。
結構汎用性が高く、いろんな状況で使用できるので、SQLを使う際はぜひ覚えておきましょう。

 

SQLServerの記事一覧

おすすめの記事