[MySQL]NULL の行を最後にしてソートする
ソート条件を付けない場合、以下のように出力されるテーブルでageがNULLのレコードは常に最下位にしてソートさせたい。
[text]+—-+———+——+
| id | name | age |
+—-+———+——+
| 1 | 名前1 | NULL |
| 2 | 名前2 | 20 |
| 3 | 名前3 | 30 |
| 4 | 名前4 | 18 |
| 5 | 名前5 | NULL |
| 6 | 名前6 | 60 |
+—-+———+——+[/text]
以下のようなSQLの場合、NULLの行が上に表示されてしまいます。
[sql]SELECT
*
FROM
users
ORDER BY
age ASC;[/sql]
[text]+—-+———+——+
| id | name | age |
+—-+———+——+
| 1 | 名前1 | NULL |
| 5 | 名前5 | NULL |
| 4 | 名前4 | 18 |
| 2 | 名前2 | 20 |
| 3 | 名前3 | 30 |
| 6 | 名前6 | 60 |
+—-+———+——+[/text]
このNULLの行を60歳のレコードの下に持って行くようなSQLは以下で実現できます。
[sql]SELECT
*
FROM
`users`
ORDER BY
age IS NULL ASC, age ASC;[/sql]
age ASCをage DESCに変えても、問題なくNULLが最下位にソートされます。
[text]mysql> SELECT * FROM `users` ORDER BY age IS NULL ASC, age ASC;
+—-+———+——+
| id | name | age |
+—-+———+——+
| 4 | 名前4 | 18 |
| 2 | 名前2 | 20 |
| 3 | 名前3 | 30 |
| 6 | 名前6 | 60 |
| 1 | 名前1 | NULL |
| 5 | 名前5 | NULL |
+—-+———+——+
mysql> SELECT * FROM `users` ORDER BY age IS NULL ASC, age DESC;
+—-+———+——+
| id | name | age |
+—-+———+——+
| 6 | 名前6 | 60 |
| 3 | 名前3 | 30 |
| 2 | 名前2 | 20 |
| 4 | 名前4 | 18 |
| 1 | 名前1 | NULL |
| 5 | 名前5 | NULL |
+—-+———+——+[/text]