在一个有两个可空的date/datetime列的表中,如何有效地选择两个日期中最早的不是NULL的日期?
具体来说,这就是我感兴趣的:
| Date1 | Date2 | | Expected |
|------------|------------| |------------|
| 2014-02-23 | 2014-01-16 | | 2014-01-16 |
| 2014-02-01 | NULL | | 2014-02-01 |
| NULL | 2014-01-13 | | 2014-01-13 |
| NULL | NULL | | NULL |
我可以使用下面的查询来获取这些结果。我的两个解决方案都使用LEAST
运算符,当其中一个参数为NULL时返回NULL(而不仅仅是当两个参数都为NULL时),因此需要更多的逻辑来完成工作。
SELECT IF(ISNULL(Date1), Date2, IFNULL(LEAST(Date1, Date2), Date1)) AS EarlyDate FROM MyTable
或等价的
SELECT IFNULL(IFNULL(LEAST(Date1, Date2), Date1), Date2) AS EarlyDate FROM MyTable
我的感觉是我上面的两个查询都有多余的东西。有人能提出更好的解决方案吗?
你必须检查null,试试这个:
SELECT IF(Date1 IS NULL OR Date2 IS NULL,
COALESCE(DATE1, DATE2),
LEAST(DATE1, DATE2)
) AS EarlyDate
FROM MyTable
工作小提琴:http://sqlfiddle.com/#!2/7940c/1
您可以在COALESCE(date1,date2)和COALESCE(date2,date1)上使用LEAST:
SELECT LEAST( COALESCE(Date1,Date2) , COALESCE(Date2,Date1) ) AS EarlyDate
FROM MyTable;
试试这个:
SELECT CASE WHEN DATE1 IS NULL OR DATE2 IS NULL THEN COALESCE(DATE1,DATE2) ELSE LEAST(Date1,Date2) END AS LEAST FROM TableName
结果:DATE
2014-01-16
2014-02-01
2014-01-13
NULL
参见SQL Fiddle。
解释:
如果其中一个日期为NULL
,则COALESCE()
用于选择第一个非null值。如果两者都是NOT NULL
,则使用LEAST()
从两者中选择最小的日期。
LEAST()
返回一个或多个表达式列表中最小的一个。点击这里阅读更多
COALESCE()
返回列表中第一个非NULL值,如果没有非NULL值则返回NULL。点击这里阅读更多