NULL を含むデータをソートするときに NULL を先頭に持ってきたり、末尾に持ってきたりしたいときがあると思います。そんなときは、真偽値でもソートできるということを知っておくと、NULL のソート順を自在に扱うことができます。
NULLのソート順
PostgreSQL において、以下のようなテーブルのデータがあったとき、
id | val01 |
---|---|
1 | b |
2 | a |
3 | NULL |
4 | c |
単純に val01 で ORDER BY をかけると
SELECT * FROM test_data ORDER BY val01;
以下のように NULL の行が最後に来ます。NULLは常に最大値という扱いなんですね。
id | val01 |
---|---|
2 | a |
1 | b |
4 | c |
3 | NULL |
NULL でない val01のソート順はそのままで、NULL の行を先頭に持っていくには、以下のようにします。
SELECT * FROM test_data ORDER BY val01 IS NULL DESC, val01;
id | val01 |
---|---|
3 | NULL |
2 | a |
1 | b |
4 | c |
まず val01 が NULL かどうかの真偽値でソートしてから val01 でソートするという順序になっています。
真偽値の昇順は false -> true の順なので、NULL を最初に持ってくるには val01 IS NULL の降順(DESC) を指定するわけです。
このように Boolean を利用したソートを入れることで、並び替えの幅が広がりますので、ぜひご活用ください。
おまけ (NULL の順番)
実は、NULL を最大値とするか最小値とするかは、DBMS の実装によって異なります。
MySQL の場合は、NULL を最小値として扱うため、以下の SQL で NULL の行が先頭に来ます。
SELECT * FROM test_data ORDER BY val01;
MySQL の場合:
id | val01 |
---|---|
3 | NULL |
2 | a |
1 | b |
4 | c |