ORDER BY 句で NULL 値を持つレコードを並べ替える


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)