31
39

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 5 years have passed since last update.

SQLのORDER BY で任意のソート順を設定する

Last updated at Posted at 2017-04-20

※追記
変換ツールを作りました。
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に採用するときは注意してください。
  • アプリで使う場合はソート順を定義した別テーブルを作成し、結合後にソート順を定義した列でソートしてください

参考:https://www.greenwich.co.jp/blog-archives/p/937

31
39
6

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
31
39

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?