ORDER BY 子句中的 CASE 按最低值 2 列对记录进行排序
想象一下,你需要按两列中任何一列的最低值排序记录。有些数据库可以使用非聚合的 MIN()
或 LEAST()
函数(... ORDER BY MIN(Date1, Date2)
),但在标准 SQL 中,你必须使用 CASE
表达式。
下面查询中的 CASE
表达式查看 Date1
和 Date2
列,检查哪个列具有较低值,并根据此值对记录进行排序。
样本数据
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-01
到 2017-01-06
升序排序记录,并且不关心哪一列 Date1
或 Date2
是那些值。