在一个包含两个可为空的日期/日期时间列的表中,您如何有效地选择两个日期中最早的非空?
具体而言,这是我感兴趣的:
| 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
我的感觉是,在我上面的两个查询中都存在多余的内容。有谁能建议更好的解决方案?
答案 0 :(得分:3)
你必须检查NULL,试试这个:
SELECT IF(Date1 IS NULL OR Date2 IS NULL,
COALESCE(DATE1, DATE2),
LEAST(DATE1, DATE2)
) AS EarlyDate
FROM MyTable
答案 1 :(得分:2)
你可以在COALESCE(date1,date2)和COALESCE(date2,date1)上使用LEAST:
SELECT LEAST( COALESCE(Date1,Date2) , COALESCE(Date2,Date1) ) AS EarlyDate
FROM MyTable;
答案 2 :(得分:1)
试试这个:
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()
返回一个或多个表达式列表中的最小值。阅读更多here。
COALESCE()
返回列表中的第一个非NULL值,如果没有非NULL值,则返回NULL。阅读更多here。