9
3

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

SQLをきちんと勉強しよう:CASE式の基本編

Posted at

「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内での条件分岐の書き方を紹介しようと思います!

9
3
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
9
3

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?