1
2

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 3 years have passed since last update.

SQLのCASE式を用いてORDER BY でソート列を作るテクニック

Last updated at Posted at 2021-08-09

問題

CASEを使った既存の体系を新たな体系に変換した集計をやっていきます。

Testsという仮のテーブルがあるとします。

key greatest
A 2
B 5
C 7
D 3

任意の順番(B→A→D→C)に並び替えるクエリを書いてください。

補足

そもそも、こんなクエリを発行させないといけないようなテーブルがおかしいですが、クエリの勉強だと思ってください。

仮定として、テーブル自体を見直した方がいいような設計であるとします。今回は仮に、ソート用の列が存在せず、ソートさせた結果が欲しいとします。

本来、SQL(SELECT)の仕事はデータ検索です。結果の見た目の整形は本来の役割ではありませんが、時としてクエリに頼らざるを得ない場面はありますよね?(僕はありました)

そういうシーンであると仮定して欲しいです。

SQL

SELECT key
FROM Tests
ORDER BY CASE key
 WHEN 'B' THEN 1
 WHEN 'A' THEN 2
 WHEN 'D' THEN 3
 WHEN 'C' THEN 4
 ELSE NULL
 END;

ソート列も出力させたいのなら

SELECT
 key,
 CASE key
 WHEN 'B' THEN 1
 WHEN 'A' THEN 2
 WHEN 'D' THEN 3
 WHEN 'C' THEN 4
 ELSE NULL
 END AS sort_col
FROM Tests
ORDER BY sort_col;

ちなみにこの書き方は 以前書いた記事👇 に似てますね。これらは、最初に書いたSQLよりも標準的なSQLにのっとってます。

なぜなら、ORDER BYSELECTよりも後に実行されるので、SELECT句で作られた計算列(今回なら: sort_col)を参照できるからです。

SELECT文の処理の実行順序

FROM // 検索対象のテーブルが決定
↓
WHERE // 条件による絞り込み
↓
GROUP BY // グループ化
↓
SELECT // SELECTに記述された計算が実行
↓
HAVING // グループ化された結果を条件によって絞り込み
↓
ORDER BY // ソート
↓
LIMIT // 指定された行数で絞り込む

参照

25p

アウトプット100本ノック実施中

1
2
0

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
1
2

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?