目次

フィールドの値によってソート条件を変えるSQL文と実行結果 - CASE句を利用したソート

目次

チップ・ハムリン
質問: フィールドに設定されたカテゴリ値でソート条件を変えたい
簡単な例で説明すると、id,category,price の3つの列のテーブルがあります。 categoryの値が1 (2以外)の場合は、priceの昇順でソートしたいです。一方、categoryの値が2の場合はpriceの降順でソートしたいです。 1つのSQL文でこのような動作のクエリを記述することはできますか?

概要

SQLでのレコードのソートにはORDER BY句を利用します。ORDER BYには複数の値を記述でき、値が同じ場合は2番目のフィールドの値でソートできます。 詳しくはこちらの記事を参照してください。

通常はORDER BYでのソートで十分ですが、利用シーンによってはより複雑なソートを実装したい場合があります。 この記事では、フィールドの値によってソートの条件を変えるSQL文を紹介します。

書式

ORDER BY (フィールド1),(フィールド2), ...
  CASE
    WHEN (条件1) THEN (フィールド名 or 値)
    WHEN (条件2) THEN (フィールド名 or 値)
    ...
    ELSE (フィールド名 or 値)
  END

以下のテーブルがあります。

id code name grade price stock
1T-002ましかくテーブル1850004
2C-003おしゃれなチェア22550002
3S-010かるがる棚1850012
4S-024ウォールナット棚2998004
5T-080メープルテーブル23840001
6S-401ロングテレビ台21980003
7C-011シンプルダイニングチェア12980016
8T-011シンプルダイニングテーブル1450004
9C-801コンフォートぺんぎんチェア212850001
10S-021チェリーキャビネット1540005


このテーブルでpriceの値でソートしますが、gradeが1のものは価格(price)で昇順、gradeが2のものは価格(price)で降順にソートしたいです。

この場合、次のSQLを実行します。

SQL文

SELECT * FROM ProductsG ORDER BY grade,
CASE
 WHEN grade=1 THEN price 
 WHEN grade=2 THEN -price
 ELSE price 
END

解説

grade=1 の場合はpriceの昇順にソートするため THEN にはprice を記述します。 grade=2 の場合はpriceの降順にソートするため、THEN には -price を記述し逆順にソートします。 それ以外のgradeの場合はpriceの昇順にソートする仕様(THEN price)としています。

結果

結果は以下になります。

id code name grade price stock
3S-010かるがる棚1850012
7C-011シンプルダイニングチェア12980016
8T-011シンプルダイニングテーブル1450004
10S-021チェリーキャビネット1540005
1T-002ましかくテーブル1850004
9C-801コンフォートぺんぎんチェア212850001
5T-080メープルテーブル23840001
2C-003おしゃれなチェア22550002
6S-401ロングテレビ台21980003
4S-024ウォールナット棚2998004

補足

-を使いたくない場合は以下の記述のSQLでも同じ結果になります。
gradeが1の場合はprice でソートし、gradeが2の場合は price DESC でソートし、それ以外の場合は priceでソートします。

SELECT * FROM ProductsG ORDER BY grade,
  CASE WHEN grade=1 THEN price END,
  CASE WHEN grade=2 THEN price END DESC,
  CASE WHEN grade>2 THEN price END
AuthorPortraitAlt
著者
iPentec.com の代表。ハードウェア、サーバー投資、管理などを担当。
Office 365やデータベースの記事なども担当。
作成日: 2025-02-25
Copyright © 1995–2025 iPentec all rights reserverd.