📝
【PostgreSQL】ORDER BYにCASE式を指定すると任意のソート順にできる理由
ORDER BY に CASE式を指定すると、
戻り値に応じたソート順にできるというやつ。
SELECT *
FROM any_table
ORDER BY
CASE any_column
WHEN "value1" THEN 1
WHEN "value2" THEN 2
ELSE 3
END
ORDER BY ソート CASE
などで検索すると色々情報が出てくる。
因みにMySQLでも同じことができる模様。
でも SQL の ORDER BY は指定したカラムの辞書順の昇順/降順(ASC/DESC)にするものなのに、
何故カラムではなく数値の指定でソートができるのか?という疑問が生まれる。
そしてその答えは公式ドキュメントに書いてあった。
7.5. 行の並べ替え
見ると、ORDER BY の構文の定義(?)は以下のようだ。
SELECT select_list
FROM table_expression
ORDER BY sort_expression1 [ASC | DESC] [NULLS { FIRST | LAST }]
[, sort_expression2 [ASC | DESC] [NULLS { FIRST | LAST }] ...]
PostgreSQL においては、ORDER BY には式を指定するのが標準らしい。
そしてカラム指定でのソートが可能という記述はその下部に
sort_expressionは以下のように列ラベルもしくは出力列の番号で指定することができます。
SELECT a + b AS sum, c FROM table1 ORDER BY sum;
SELECT a, max(b) FROM table1 GROUP BY a ORDER BY 1;
とあり、こちらがオマケの存在のようだ。
Discussion