値がNULLでない列がある場合に、その列の値を用いてソートしたい

Master Mole
質問: 値がある場合には別の列の値を優先してソート条件にしたい
以下のテーブルがあるのですが、shipment_date の値でソートしたいです。ただし、reshipment_date に値がある場合は reshipment_dateの値を利用したいです。 どのようなSQLを記述すればよいでしょうか?

idproductpriceshipment_datereshipment_date
1ぺんぎんクッキー1852025-08-03 00:00:002025-10-12 00:00:00
2らくだキャラメル852025-09-02 00:00:00NULL
3くじらケーキ2202025-09-04 00:00:002025-12-21 00:00:00
4しろくまアイス 2852025-11-25 00:00:00NULL
5かるがもサブレ 1252025-02-07 00:00:002025-08-06 00:00:00
6かぴばらタルト 1602025-05-25 00:00:00NULL

方針

値がNULLでない列がある場合に、その列の値を用いてソートする場合には、COALESCE 関数を利用するとシンプルに記述できます。

COALESCE関数の書式

COALESCE関数の書式は次の通りです。

COALESCE ( 列名1, 列名2, ... 列名n )
COALESCE ( 変数1, 変数2, ... 変数n )

COALESCE関数の動作

COALESCE 関数は最初のNULLでない値を返します。

シンプルな例

例1

以下のSQLの場合、4が結果となりjます。

select COALESCE (NULL, NULL, 4, 7, NULL)

例2

以下のSQLの場合、45が結果となりjます。

declare @val1 int = NULL 
declare @val2 int = 45 
declare @val3 int = 22 

select COALESCE (@val1, @val2, @val3)

値がNULLでない列がある場合に、その列の値を用いてソートする場合

以下のテーブルにおいて、shipment_date でソートするが、reshipment_date の値がある場合には、reshipment_dateの値を利用してソートする場合、 次のSSL文となります。

Products テーブル
idproductpriceshipment_datereshipment_date
1ぺんぎんクッキー1852025-08-03 00:00:002025-10-12 00:00:00
2らくだキャラメル852025-09-02 00:00:00NULL
3くじらケーキ2202025-09-04 00:00:002025-12-21 00:00:00
4しろくまアイス 2852025-11-25 00:00:00NULL
5かるがもサブレ 1252025-02-07 00:00:002025-08-06 00:00:00
6かぴばらタルト 1602025-05-25 00:00:00NULL


select * FROM PRODUCTS ORDER BY  COALESCE (reshipment_date, shipment_date)


結果は以下になります。reshipment_date が設定されているレコードは reshipment_dateの値でソートできています。

idproductpriceshipment_datereshipment_date
6かぴばらタルト 1602025-05-25 00:00:00NULL
5かるがもサブレ 1252025-02-07 00:00:002025-08-06 00:00:00
2らくだキャラメル852025-09-02 00:00:00NULL
1ぺんぎんクッキー1852025-08-03 00:00:002025-10-12 00:00:00
4しろくまアイス 2852025-11-25 00:00:00NULL
3くじらケーキ2202025-09-04 00:00:002025-12-21 00:00:00
AuthorPortraitAlt
著者
iPentec.com の代表。ハードウェア、サーバー投資、管理などを担当。
Office 365やデータベースの記事なども担当。
作成日: 2025-12-22