MySQL:获取多个列中的最大值或最大值,但字段为空

MySQL:获取多个列中的最大值或最大值,但字段为空,mysql,null,max,Mysql,Null,Max,我试图在每个记录(MySQL)的三个不同字段中选择最大日期 所以,在每一行中,我有date1、date2和date3:date1总是被填充的,date2和date3可以是NULL或空的 最好的语句简单明了,但对空字段没有影响,因此这不太好用: SELECT id, GREATEST(date1, date2, date3) as datemax FROM mytable 我也尝试过这样更复杂的解决方案: SELECT CASE WHEN date1 >= date

我试图在每个记录(MySQL)的三个不同字段中选择最大日期 所以,在每一行中,我有date1、date2和date3:date1总是被填充的,date2和date3可以是NULL或空的 最好的语句简单明了,但对空字段没有影响,因此这不太好用:

SELECT id, GREATEST(date1, date2, date3) as datemax FROM mytable
我也尝试过这样更复杂的解决方案:

SELECT
    CASE
        WHEN date1 >= date2 AND date1 >= date3 THEN date1
        WHEN date2 >= date1 AND date2 >= date3 THEN date2
        WHEN date3 >= date1 AND date3 >= date2 THEN date3
        ELSE                                        date1
    END AS MostRecentDate
delimiter //
drop function if exists cp_greatest_date//
create function cp_greatest_date ( dateA timestamp, dateB timestamp ) returns timestamp
  deterministic reads sql data
  begin

    # if both are null you get null, if one of them is not null of both of them are not null, you get the greatest
    set @output = nullif(greatest(coalesce(dateA, from_unixtime(0)), coalesce(dateB, from_unixtime(0))), from_unixtime(0));
    # santiago arizti

    return @output;
  end //
delimiter ;
这里也有同样的问题:在返回正确的记录时,空值是一个很大的问题

拜托,你有解决办法吗?
提前感谢….

最伟大的
中使用日期列之前,请将它们合并起来


处理它们的方式将取决于您希望如何处理
NULL
。。高还是低?

使用
合并

SELECT id, 
   GREATEST(date1, 
     COALESCE(date2, 0),
     COALESCE(date3, 0)) as datemax 
FROM mytable

更新:这个答案以前使用的是
IFNULL
,但正如迈克·张伯伦在评论中指出的那样,
COALESCE
实际上是首选方法。

如果
date1
永远不能
NULL
,那么结果永远不应该是
NULL
,对吗?然后,如果希望计算中不计算
NULL
日期,则可以使用此选项(或者如果希望NULL计算为“时间结束”,则将
1000-01-01
更改为
9999-12-31
):


buuut,如果所有日期都是空的?您仍然希望将null作为输出,对吗?那你需要这个

select nullif(greatest(coalesce(<DATEA>, from_unixtime(0)), coalesce(<DATEB>, from_unixtime(0))), from_unixtime(0));
那么你可以这样使用它

select cp_greatest_date(current_timestamp, null);
-- output is 2017-05-05 20:22:45

顺便说一句,这假设如果日期为空,它将不包括在最大的计算中,以澄清COALESCE正在做什么(因为我没有立即理解它,所以认为它可能有助于其他人进行解释)。COALESCE返回第一个非Null值,因此通过传递日期和0,如果日期为Null,则COALESCE(日期,0)的输出将为0,并且您将在日期和0之间取最大值,从而生成日期。起初我不明白为什么它有效,但现在我明白了。进一步阅读@MattDodge-您提到了“迈克·张伯伦”的一条评论,该评论似乎已不复存在。你能解释一下为什么
COALESCE()
IFNULL()更受欢迎吗?我认为后者会更有效。@billynoah好吧,已经7年多了,所以我的记忆有点模糊哈哈,但我相信有一些文档明确建议使用COALESCE,因为它是通用SQL规范或类似规范的一部分。“不过我不清楚对性能的影响。”马特道奇-谢谢,我做了一些调查,得出了相同的结论
select cp_greatest_date(current_timestamp, null);
-- output is 2017-05-05 20:22:45