- MySQL
- 2022-07-12
SQLのORDER BY句では、特定のカラムを昇順や降順に並べ替えることができます。
更にCASE式を使えば任意の並び順にすることも可能です。
今回は、特定のカラムがNULLとなる場合があるテーブルで、NULLは最後にまとめて表示し、それ以外は昇順の表示になるようにしてみたいと思います。
例として以下のようなテーブルがあったとします。
id | name | age |
---|---|---|
1 | 赤井 | 35 |
2 | 池田 | 22 |
3 | 内山 | NULL |
4 | 江崎 | 54 |
5 | 太田 | NULL |
年齢の昇順でデータを表示してみましょう。
SELECT * FROM TEST_TABLE ORDER BY age;
そうすると、NULLが先に表示され、それ以降が年齢の昇順という形になるかと思います。
id | name | age |
---|---|---|
3 | 内山 | NULL |
5 | 太田 | NULL |
2 | 池田 | 22 |
1 | 赤井 | 35 |
4 | 江崎 | 54 |
これを、NULLは最後にまとめて表示し、それ以外を年齢の昇順で表示したい…というのが今回の焦点でしたね。
そのような場合にORDER BY句でCASEの条件式を使います。
SELECT * FROM TEST_TABLE ORDER BY CASE WHEN age IS NULL THEN 2 ELSE 1 END, age;
このようにORDER BY句でCASE式を使用し、年齢がNULLの場合の優先順位を下げてあげるわけです。
その後、年齢の昇順を指定しているので、実行結果の並び順は以下のようになります。
id | name | age |
---|---|---|
2 | 池田 | 22 |
1 | 赤井 | 35 |
4 | 江崎 | 54 |
3 | 内山 | NULL |
5 | 太田 | NULL |
ただし、パフォーマンスはあまりよくないようなので、大規模なデータベースで使うのは避けたほうが良いかもしれません。
使いようによっては便利なので、是非一度試してみてください。