[MySQL]NULL の行を最後にしてソートする

2012年3月22日

ソート条件を付けない場合、以下のように出力されるテーブルで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]

MySQL,SQL

Posted by GENDOSU