Oracle ORDER BYの条件でNULLの出力順を制御する方法
ORDER BY 句で昇順にすると、必ずNULLが後ろになる。そして降順にすると、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のソート順の定義でやりたいこと
- DATA_NAMEの昇順で出力したい
- 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 が最後に出力されるコマンド NULLS LAST を付け加えると、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つ、是非覚えておいてください。