あれ?そうなのか。と思ったのでメモ。
仮にPostgreSQLで作られたDBに下記のような、personテーブルがあるとします。
この時、placeのNULLの箇所を「その他」として、別名として「prefecture」として、prefectureの降順で並び替えるようにするには下記のようになります。
SELECT name, COALESCE(place, 'その他') AS prefecture FROM person ORDER BY prefecture
PostgreSQLではORDER BY句に別名を指定できるのでこの記述は問題なく実行されます。結果は下記のようになります。
ここで、基本的にprefectureを降順で並び替えたいけど、その他は一番最後になるようにしたい。と思って下記のようなSQLを書きました。
SELECT name, COALESCE(place, 'その他') AS prefecture FROM person ORDER BY (CASE WHEN prefecture = 'その他' THEN 1 ELSE 0 END), prefecture
prefectureが「その他」の場合は1、それ以外の場合は0として降順しようとしています。
ただ、このSQLを実行すると、失敗して、
ERROR: 列”prefecture”は存在しません
というエラーメッセージが表示されます。
どうやら、並び替えでの指定で直接別名を指定する分は機能するようですが、CASEを使ったり、式を書いたりした中での別名指定はできないようです。
というわけで、上記の指定で並び替えするには下記のようになります。
SELECT name, COALESCE(place, 'その他') AS prefecture FROM person ORDER BY (CASE WHEN place IS NULL THEN 1 ELSE 0 END), prefecture
※NULLのある項目で降順すると、標準でNULLが最後になるので、CASEなんて使わなくていいんですけどね…。あくまで説明用です。CASEを使う並び替えのいい例が思いつかなかったので…。
コメント