ORDER BY 句で NULL 値の順序を制御する
PostgreSQL で NULL が含まれる列を ORDER BY 句で並べ替えると NULL 値を持つレコードが最後に表示されます。しかしこれでは都合が悪いことが多々あり NULL 値を持つレコードを最初に表示したい場合もあります。そのような場合に NULL 値を持つレコードを最初に表示したり最後に表示したりしてみます。データベースのデータを基にレポートを作成したり集計したりする場合には非常に多用されます。
テストデータを用意する
まず単純なテーブルを作成して NULL 値を含む7件のレコードを登録します。=> CREATE TABLE hoge (id serial, name text); => INSERT INTO hoge (name) VALUES ('foo'), ('bar'), (NULL), ('abc'), ('def'), (NULL), ('123'); INSERT 0 7 => SELECT * FROM hoge; +----+------+ | id | name | +----+------+ | 1 | foo | | 2 | bar | | 3 | | | 4 | abc | | 5 | def | | 6 | | | 7 | 123 | +----+------+ (7 rows)
NULL 値を持つレコードを ORDER BY で制御する
まず最初に name 列を ORDER BY 句で昇順で並べ替えます。 NULL 値を持つレコードが最後に表示されます。=> SELECT * FROM hoge ORDER BY name; +----+------+ | id | name | +----+------+ | 7 | 123 | | 4 | abc | | 2 | bar | | 5 | def | | 1 | foo | | 3 | | | 6 | | +----+------+ (7 rows)
同様に name 列を昇順で並べ替えますが、"NULLS FIRST" を付けて NULL 値が最初に表示されるようにしてみます。
=> SELECT * FROM hoge ORDER BY name NULLS FIRST; +----+------+ | id | name | +----+------+ | 6 | | | 3 | | | 7 | 123 | | 4 | abc | | 2 | bar | | 5 | def | | 1 | foo | +----+------+ (7 rows)
今度は name 列を降順で並べ替えてみます。NULL 値を持つレコードが最初に表示されています。
=> SELECT * FROM hoge ORDER BY name DESC; +----+------+ | id | name | +----+------+ | 6 | | | 3 | | | 1 | foo | | 5 | def | | 2 | bar | | 4 | abc | | 7 | 123 | +----+------+ (7 rows)
そして同様に name 列を降順で並べ替えますが、"NULLS LAST" を付けて NULL 値が最後に 表示されるようにしてみます。
=> SELECT * FROM hoge ORDER BY name DESC NULLS LAST; +----+------+ | id | name | +----+------+ | 1 | foo | | 5 | def | | 2 | bar | | 4 | abc | | 7 | 123 | | 3 | | | 6 | | +----+------+ (7 rows)