LoginSignup
4
8

【SQL】条件付きソート/SQLマスターへの道「CASE・WHEN」

Posted at

導入

SQL文で並び替えをカスタマイズしたい場合、一般的にはORDER BYでソートする事が多いですよね。
今回はORDER BYを使って、より複雑なソート条件に対応するテクニックについて紹介をします。
キーワードは「when」「case」です。

ORDER BY について

(※ 初学者向けです。ORDER BYくらい知ってるよって方はスキップしてください。)
通常のORDER BYについて簡単に説明をします。
具体例を出したほうが早いですかね。

データベース内のポケモンテーブルで図鑑No.でのソートを例に出すと...

SELECT `pokemon_data`.`id`, `pokemon_data`.`name`
FROM `pokemon_data`
ORDER BY `pokemon_data`.`id` ASC

結果はこんな感じです。

| id | name       |
|----|------------|
| 1  | フシギダネ  |
| 2  | フシギソウ  |
| 3  | フシギバナ  |
| 4  | ヒトカゲ    |
| 5  | リザード    |

(To Be Continued...)

要件

今回の要件はこちら!

  • ポケモンの一覧で通常は図鑑順
  • タイプが「ドラゴン・ひこう」・地方が「ホウエン」の場合、上に表示させる

(もう結果はわかりますか?あの三体ですね。)

実装

コード

SELECT `pokemon_data`.`id`, `pokemon_data`.`name`, `pokemon_data`.`type`
FROM `pokemon_data`
ORDER BY CASE
  WHEN `pokemon_data`.`type` = 'ドラゴン・ひこう'
    AND `pokemon_data`.`region` = 'ホウエン' THEN 0
  ELSE 1
  END,
  `pokemon_data`.`id` ASC;

解説

今回のポイント

  • タイプが「ドラゴン・ひこう」かつ地方が「ホウエン」である場合にはソートキーを「0」
    それ以外の場合にはソートキーを「1」
  • 通常はサイズ順に並び替えられる

今回のポイントは、CASE句
CASE句を利用することでソートキーのような形で重み付けをすることができます。

SQL結果

| id  | name       | type            |
|----|------------|-----------------|
| 334  | チルタリス   | ドラゴン・ひこう |
| 373 | ボーマンダ   | ドラゴン・ひこう   |
| 384 | レックウザ   | ドラゴン・ひこう     |
| 1  | フシギダネ   | くさ・どく       |
| 2  | フシギソウ   | くさ・どく       |
| 3  | フシギバナ   | くさ・どく       |
| 4  | ヒトカゲ     | ほのお           |

はい。答えは「チルタリス」・「ボーマンダ」・「レックウザ」でした〜。

まとめ

今回は、ORDER BYCASEを組み合わせて複雑なソート条件への対応方法について解説しました。

4
8
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
4
8