【SQL】ORDER BY で NULL を最後にする場合の注意点
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の場合は、挙動がまったく逆になるイメージです。