「わからない」を「わかった」に変えるブログ

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

更新日: 公開日:2013/05/23

ORDER BY 句で昇順にすると、必ずNULLが後ろになる。そして降順にすると、NULLが先頭に来てしまう。ソートの昇順でNULLを先に先頭に出力したり、降順のときにNULLが後ろに出力することはできないか?

➡ これ、SQLで表示順を制御できます

今回は ORDER BY 句における NULL 値の並び順の制御方法について説明します。

以下のようなデータを持つテーブル「T_NAME」があるとします。

サンプルテーブル: T_NAME

IDDATA_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;
IDDATA_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;
IDDATA_NAME
00007ハレハレ君
00006ジョニー
00004ジロー君
00002コジコジ
00001(null)
00003(null)
00005(null)

これでNULL値のデータがあっても、安心して思い通りのソート順に並べることができるようになります。「NULLS FIRST」「NULLS LAST」この2つ、是非覚えておいてください。

\ この記事をシェアする /