PostgreSQLのorder byに別名は使えるけど、order byのcaseの中で別名は使えないよう

あれ?そうなのか。と思ったのでメモ。

仮に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を使う並び替えのいい例が思いつかなかったので…。

コメント

タイトルとURLをコピーしました