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)
