【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;  

とあり、こちらがオマケの存在のようだ。

参考リンク