導入
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 BY
とCASE
を組み合わせて複雑なソート条件への対応方法について解説しました。