📝

【PostgreSQL】ORDER BYにCASE式を指定すると任意のソート順にできる理由

2021/06/26に公開

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