
目次
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を使う際はぜひ覚えておきましょう。