CASE式の使い方について実例を交えながら解説していきます。
MySQLでは条件分岐にIF文が使用可能です。聞き慣れた文法ということもあり、よく使用されると思います。
ですがCASE式の方が多岐分岐の際の記述が簡潔であったり標準SQLである点が優れているとされますので、理解しておくと非常に便利です。
CASE式の書き方
たとえば商品名カラムを持つ商品情報管理のProductテーブルを用意します。
カラム | 値 |
---|---|
productName | 商品A/商品B |
以下のようにSQLを記述すると商品ごとに分類名に読み替えた集計結果が得られます。
SELECT CASE productName
WHEN "商品A" THEN "衣服"
WHEN "商品B" THEN "家具"
ELSE "その他"
END
FROM Product;
このようなCASE 'カラム名' WHEN aaa THEN bbb
のCASE文の書き方を単純CASE式と呼びます。
その名のとおり簡潔に書けますが、できることも限られるため基本的には下記のような検索CASE式の書き方をすることが多いです。
検索CASE式はCASE WHEN 'カラム名' = aaa THEN bbb
のように書きます。
SELECT CASE
WHEN productName = "商品A" THEN "衣服"
WHEN productName = "商品B" THEN "家具"
ELSE "その他"
END
FROM Product;
CASE式を書く際の注意点
各分岐の型をそろえる
たとえば以下のように、条件によって文字型を返したり数値型を返したりする記述は実行時エラーとなります。
CASE式の返すデータ型は必ず統一するようにしましょう。
-- エラーになる!
SELECT CASE
WHEN productName = "商品A" THEN 0
WHEN productName = "商品B" THEN "家具"
ELSE "その他"
END
FROM Product;
CASE式の最後にENDを書く
CASE式の最後のENDは必須です。
これがないと構文エラーになりますのでご注意ください。
-- エラーになる!
SELECT CASE
WHEN productName = "商品A" THEN "衣服"
WHEN productName = "商品B" THEN "家具"
ELSE "その他"
FROM Product;
ELSE句を書く
ENDとは異なり、ELSE句はオプションなので無くても動作します。
その場合は暗黙的にELSE NULL
の扱いになりますが、実装者以外の人が見たときにNULLと扱って問題ないか判断がつきにくく、また将来的にCASE式の仕様が変わることがあればバグの温床にもなるため、あまり良いコードとは言えません。
NULLと扱って問題ない場合でも明示的にELSE NULL
と書くようにしましょう。
-- NULLで問題ない場合でもELSE句は明示的に書く!
SELECT CASE
WHEN productName = "商品A" THEN "衣服"
WHEN productName = "商品B" THEN "家具"
ELSE NULL
FROM Product;
まとめ
CASE式の基本的な使い方について解説しました。
異なる条件の集計など、より実践的な使い方については機会があればまとめてみたいと思います!