Oracle ORDER BYの条件でNULLの出力順を制御する方法

ORDER BY 句で昇順にすると、いつもNULLが後ろにくるのが嫌!
降順にすると、いつもNULLが先頭にくるのが嫌!
そんな思いをしている皆さん、実はNULLの表示順はSQLで制御できるのです。今回は ORDER BY 句における NULL 値の並び順の制御方法について説明します。
以下のようなデータを持つテーブル「T_NAME」があるとします。
サンプルテーブル: T_NAME
ID | DATA_NAME |
---|---|
00001 | (null) |
00002 | コジコジ |
00003 | (null) |
00004 | ジロー君 |
00005 | (null) |
00006 | ジョニー |
00007 | ハレハレ君 |
SQL の ORDER BY において、NULL 値は一番大きな値として扱われてしまうので、昇順の場合の表示順はいつも最後になってしまいます。
ここで、もしNULLを最初に出すようにしたい場合、どうすればいいのでしょうか?
NULLのソート順の定義でやりたいこと
- NULL値のデータが先に表示するようにしたい
- NULL以外のデータは昇順になるようにしたい
実はこの両方を満たす機能が存在します。「NULLを先に抽出します」と、ORDER BY 句の項目に定義することができるのです。説明するより見てもらった方が早いので、ご覧ください。
ORDER BY句でNULL値のデータを先に表示する方法
SELECT * FROM T_NAME
ORDER BY DATA_NAME NULLS FIRST, ID;
ID | DATA_NAME |
---|---|
00001 | (null) |
00003 | (null) |
00005 | (null) |
00002 | コジコジ |
00004 | ジロー君 |
00006 | ジョニー |
00007 | ハレハレ君 |
「NULLS FIRST」を ORDER BY 句のフィールド名の後ろにつけてあげれば、NULL が先頭になるようにソートしてくれます。ORDER BY 句のデフォルトは昇順なので「ASC」の定義は省略しましたが、省略しない場合の書き方はこちらになります。
SELECT * FROM T_NAME
ORDER BY DATA_NAME ASC NULLS FIRST, ID;
一方、降順でソートする場合、今度は逆に NULL が先に抽出されてしまうので、上記と同じように NULL 値を制御するコマンドを付け加えてあげることで、NULL 値のデータを後ろに持ってくることができるようになります。
ORDER BY句でNULL以外のデータを昇順にする方法
SELECT * FROM T_NAME
ORDER BY DATA_NAME DESC NULLS LAST, ID;
ID | DATA_NAME |
---|---|
00007 | ハレハレ君 |
00006 | ジョニー |
00004 | ジロー君 |
00002 | コジコジ |
00001 | (null) |
00003 | (null) |
00005 | (null) |
これでNULL値のデータがあっても、安心して思い通りのソート順に並べることができるようになります。「NULLS FIRST」「NULLS LAST」この2つは是非覚えておいてください。