ORDER BY 子句中的 CASE 按最低值 2 列對記錄進行排序

想象一下,你需要按兩列中任何一列的最低值排序記錄。有些資料庫可以使用非聚合的 MIN()LEAST() 函式(... ORDER BY MIN(Date1, Date2)),但在標準 SQL 中,你必須使用 CASE 表示式。

下面查詢中的 CASE 表示式檢視 Date1Date2 列,檢查哪個列具有較低值,並根據此值對記錄進行排序。

樣本資料

ID 日期 1 DATE2
1 2017 年 1 月 1 日 2017 年 1 月 31 日
2 2017 年 1 月 31 日 2017 年 1 月 3 日
3 2017 年 1 月 31 日 2017 年 1 月 2 日
4 2017 年 1 月 6 日 2017 年 1 月 31 日
2017 年 1 月 31 日 2017 年 1 月 5 日
6 2017 年 1 月 4 日 2017 年 1 月 31 日

詢問

SELECT Id, Date1, Date2
FROM YourTable
ORDER BY CASE 
           WHEN COALESCE(Date1, '1753-01-01') < COALESCE(Date2, '1753-01-01') THEN Date1 
           ELSE Date2 
         END

結果

ID 日期 1 DATE2
1 2017 年 1 月 1 日 2017 年 1 月 31 日
3 2017 年 1 月 31 日 2017 年 1 月 2 日
2 2017 年 1 月 31 日 2017 年 1 月 3 日
6 2017 年 1 月 4 日 2017 年 1 月 31 日
2017 年 1 月 31 日 2017 年 1 月 5 日
4 2017 年 1 月 6 日 2017 年 1 月 31 日

說明

正如你看到 Id = 1 的行是第一個,因為 Date1 從整個表 2017-01-01 有最低記錄,Id = 3 是第二行,因為 Date2 等於 2017-01-02 是表中的第二低值,依此類推。

所以我們已經從 2017-01-012017-01-06 升序排序記錄,並且不關心哪一列 Date1Date2 是那些值。