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 是那些值。