「SQLをきちんと勉強しよう」の第一弾です。
普段、業務ではRuby on Raisを主に使用しています。
そのため、簡単なデータベース操作はActiveRecordで実現できてしまいます。
でもやっぱりActiveRecordでは表現できない処理をSQLでしたい時もあるので、きちんと生SQLを使いこなせるように勉強していきたいなと感じました。
今回の記事では、CASE式の基本的な使い方をまとめました。
CASE式は、SELECT句やORDER BY句など、さまざまな場所で使用できるため、使いこなせるとSQLの表現の幅が広がります。
CASE式の基本
CASE式には
- 単純CASE式
- 検索CASE式
の2種類があります。
-- 単純CASE式
SELECT CASE result
WHEN '1' THEN '合格'
WHEN '0' THEN '不合格'
ELSE 'その他' END AS result_text
FROM Test;
-- 検索CASE式
SELECT CASE
WHEN result = '0' THEN '◯'
WHEN result = '1' THEN '×'
ELSE 'その他' END AS result_text
FROM Test;
単純CASE式ではTRUE条件しか判定できません。
一方で検索CASE式ではそれ以外の条件も判定できるので、自由度が高くなります。
CASE式の評価ルール
CASE式は、真になる条件が見つかった段階で評価を打ち切り、後続は無視されます。
そのため、WHEN句は排他的に記述するのが望ましいです。
例えば以下のように書くと、二つ目のWHEN句は絶対に評価されません。
SELECT CASE
WHEN result IN ('0', '1') THEN 'A'
WHEN result IN('0') THEN 'B'
ELSE 'C' END AS result_text
FROM Test;
返却するデータ型を統一する
各分岐で返却するデータ型は、整合性を担保するために統一する必要があります。
以下のように、分岐ごとに違う型を返却するのはNGです。
SELECT CASE
WHEN result = '0' THEN '◯'
WHEN result = '1' THEN 1
ELSE 'その他' END AS result_text
FROM Test;
ELSE句は必ず書く
ELSE句を省略すると、ELSE NULL
と同じ扱いになります。
ELSE句を省略してもエラーにはなりません。
しかし、意図しない挙動を生む可能性があるため、ELSE句は明示する方が良いです。
WHERE句やORDER BY句でCASE式を使う
CASE式はSELECT句だけでなく、WHERE句やORDER BY句などにも使用できます。
これにより、特定の条件に基づいてフィルタリングやソートを行うことが可能です。
WHERE句での使用例
次の例では、statusが'active'のときにcustomer_idが特定範囲内にある行のみを取得します。
SELECT * FROM Customers
WHERE CASE
WHEN status = 'active' THEN customer_id BETWEEN 100 AND 200
ELSE customer_id IS NOT NULL
END;
ORDER BY句での使用例
ORDER BY句での使用により、特定の条件でソート順を変えられます。例えば、優先的にソートしたい条件を指定できます。
コードをコピーする
SELECT * FROM Products
ORDER BY CASE
WHEN stock_status = 'in_stock' THEN 1
WHEN stock_status = 'low_stock' THEN 2
ELSE 3
END;
在庫がある商品が最優先で並び、その次に在庫が少ない商品、最後に在庫がない商品が表示されるようにソートされます。
まとめ
今回の記事では、SQLのCASE式の基本的な使い方を紹介しました。
CASE式を活用することで、データの条件分岐をSQL内で直接行えるため、集計や分類といった複雑な処理も1つのクエリで行えるようになります。
次回は応用編として、CASE式を使って、テーブル同士のマッチングやUPDATE内での条件分岐の書き方を紹介しようと思います!