PostgreSQL: nullを含むカラムをソート,nullを末尾(先頭)に
 2007.05.18

PostgreSQLでnull値を含むカラムでソートするとき,nullのレコードを末尾(あるいは先頭)に出力するSQLの書き方. 以下のようなテーブルの場合を考えます.
yostest=> SELECT * from foo order by i;
 i  |   t
----+--------
  0 | zero
  1 | one
  2 | two
 10 | ten
 11 | eleven
    | none
(6 rows)
* ORDER BY句には条件式が記述できます. * booleanの値をソートした場合 true は false より高い(大きい)値としてソートされます. したがって,例のfooテーブルでカラムiで降順にソートし,かつ null の行を末尾にしたい場合は以下のSQLで実現できます.
yostest=> SELECT * from foo order by (i is null), i desc;
 i  |   t
----+--------
 11 | eleven
 10 | ten
  2 | two
  1 | one
  0 | zero
    | none
(6 rows)
つまり,まず i is null の結果でソートします.i is null がtrueの行は i is null が false の行よりも大きい値ですから,「ORDER BY (i is null) 」のソート条件では末尾に出力されます.次に「ORDER BY i desc 」のソートが行われるので,目的の検索結果を得ることができます. i is not null や (i is null) desc 等を使えば,nullの行を先頭にした結果を得ることができます.
カテゴリー:技術情報メモ