※追記
変換ツールを作りました。
https://yuyabu.github.io/OrderByWithCaseExpressionGenerator/
SQLのORDER BYでは昇順・降順で特定のカラム(単独or 組み合わせ)の並びを指定できるが、CASE式を組み合わせて、任意のソート順を指定出来ることを最近知った。
(SQL内だけでこういうことが実現できるのが衝撃的)
前提となる一次テーブル
WITH students as(
SELECT 1 AS sid, '高橋太郎'   AS sname FROM DUAL 
UNION ALL
SELECT 2 AS sid, '山田幸助'   AS sname FROM DUAL
UNION ALL
SELECT 3 AS sid, '鈴木美恵子' AS sname FROM DUAL
UNION ALL
SELECT 4 AS sid, '織田信長'   AS sname FROM DUAL
)
SELECT * FROM students ORDER BY sid
| SID | SNAME | 
|---|---|
| 1 | 高橋太郎 | 
| 2 | 山田幸助 | 
| 3 | 鈴木美恵子 | 
| 4 | 織田信長 | 
例えば上記のようなテーブルの場合
sidが
- 1→2→3→4
 - 4→3→2→1
 
の並びで並び替えることはorder by にascまたはdescを指定することで
実現できるのは常識だが、CASE式をORDER BYの中で使うことで
- 4→2→3→1
 
のような順番でソートすることができる。
CASE式で任意のソート順を指定する
SELECT * FROM students 
ORDER BY
  CASE sid WHEN  4  THEN 1 ELSE 2 END,
  CASE sid WHEN  2  THEN 1 ELSE 2 END,
  CASE sid WHEN  3  THEN 1 ELSE 2 END,
  CASE sid WHEN  1  THEN 1 ELSE 2 END,
sid
結果
SID     SNAME
4       織田信長
2       山田幸助
3       鈴木美恵子
1       高橋太郎
用途
- オリジナルのソート順を作る(S → M → L等)
 - 特定の要素を先頭に表示する(国コードの列挙で日本を先頭に表示等)
 - 過去のエビデンスなどの資料に記載されている、特に規則のない順序に合わせたソートを実現する
 
補足
- パフォーマンスがあまり良くないのでアプリケーションで使うSQLに採用するときは注意してください。
 - アプリで使う場合はソート順を定義した別テーブルを作成し、結合後にソート順を定義した列でソートしてください