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