【SQL】ORDER BY で NULL を最後にする場合の注意点

categories DB, IT関連 | Tags: | scot_exist | datetime 2011年4月6日 12:22 | コメントは受け付けていません。 | Save & Share

SQLでNULL値を含むカラムでソートを実施する場合、何も意識しないと最小の値として処理されてしまいます。

例えば次のようなレコードが存在する場合

test_tab

num
1
null
3
2



select * from test_tab order by num asc;
こんな書き方をすると次のような順で出力されます。

test_tab

num
null
1
2
3

null値が最小として扱われてしまいます。
null値を最後(この場合は最大)と扱いたい場合は下記のように書きます。

select * from test_tab order by num is null asc;

test_tab

num
1
3
2
null

お気付きとは思いますが、この書き方だけでは、null値が最大として扱われただけであって、通常のソートは行われていません。

そのため、下記のように書き直します。

select * from test_tab order by num is null asc, num asc;
こうすると下記のような出力になり、取りたい値となりました。

test_tab

num
1
2
3
null

まとめ

ORDER BY 時に利用出来る、カラム is null [asc|desc] はあくまでnull値の取扱をどうするか決めているだけなので、null以外の値にはソートが効いていないので、注意が必要。


ちょっとはまったので、参考までに
なお、DESCの場合は、挙動がまったく逆になるイメージです。

ページTOPへ