Mysql 按三个日期中最早的一个(空值)排序
基于这个问题,我开发了一段代码,如下所示:Mysql 按三个日期中最早的一个(空值)排序,mysql,Mysql,基于这个问题,我开发了一段代码,如下所示: order by case when bez_datum IS NULL then case when verg_datum IS NULL then event_datum when event_datum IS NULL then verg_datum when verg_datum < event_datum
order by
case
when bez_datum IS NULL
then
case
when verg_datum IS NULL
then event_datum
when event_datum IS NULL
then verg_datum
when verg_datum < event_datum
then verg_datum
else event_datum
end
when verg_datum IS NULL
then
case
when event_datum IS NULL
then bez_datum
else if(bez_datum < event_datum, bez_datum, event_datum)
end
when event_datum IS NULL
then if(bez_datum < verg_datum, bez_datum, verg_datum)
else if(bez_datum < verg_datum, if(bez_datum < event_datum, bez_datum, event_datum), if(verg_datum < event_datum, verg_datum, event_datum))
end
id date1 date2
1 05-09-2018 01-09-2018
2 03-09-2018 06-09-2018
3 02-09-2018 07-09-2018
4 05-09-2018 null
id date1 date2 sorted on
1 05-09-2018 01-09-2018 01-09-2018
3 02-09-2018 07-09-2018 02-09-2018
2 03-09-2018 06-09-2018 03-09-2018
4 05-09-2018 null 05-09-2018
order by
least(
-- each date goes here...
-- |
-- \|/
coalesce(bez_datum, verg_datum, event_datum),
coalesce(verg_datum, bez_datum, event_datum),
coalesce(event_datum, bez_datum, verg_datum)
)
我希望它是这样的:
order by
case
when bez_datum IS NULL
then
case
when verg_datum IS NULL
then event_datum
when event_datum IS NULL
then verg_datum
when verg_datum < event_datum
then verg_datum
else event_datum
end
when verg_datum IS NULL
then
case
when event_datum IS NULL
then bez_datum
else if(bez_datum < event_datum, bez_datum, event_datum)
end
when event_datum IS NULL
then if(bez_datum < verg_datum, bez_datum, verg_datum)
else if(bez_datum < verg_datum, if(bez_datum < event_datum, bez_datum, event_datum), if(verg_datum < event_datum, verg_datum, event_datum))
end
id date1 date2
1 05-09-2018 01-09-2018
2 03-09-2018 06-09-2018
3 02-09-2018 07-09-2018
4 05-09-2018 null
id date1 date2 sorted on
1 05-09-2018 01-09-2018 01-09-2018
3 02-09-2018 07-09-2018 02-09-2018
2 03-09-2018 06-09-2018 03-09-2018
4 05-09-2018 null 05-09-2018
order by
least(
-- each date goes here...
-- |
-- \|/
coalesce(bez_datum, verg_datum, event_datum),
coalesce(verg_datum, bez_datum, event_datum),
coalesce(event_datum, bez_datum, verg_datum)
)
因此,表应该按照两个日期中最早的一个进行排序,而不是计算null。(sorted on不是应该显示的列,它只是显示用于排序的内容)
目前我的印象是它只根据事件数据进行排序。我认为您可以使用,它支持多个值。不幸的是,如果其中一个值为null
,则least
始终返回null
。您可以使用coalesce
解决这个问题
您的order by条款可能如下所示:
order by
case
when bez_datum IS NULL
then
case
when verg_datum IS NULL
then event_datum
when event_datum IS NULL
then verg_datum
when verg_datum < event_datum
then verg_datum
else event_datum
end
when verg_datum IS NULL
then
case
when event_datum IS NULL
then bez_datum
else if(bez_datum < event_datum, bez_datum, event_datum)
end
when event_datum IS NULL
then if(bez_datum < verg_datum, bez_datum, verg_datum)
else if(bez_datum < verg_datum, if(bez_datum < event_datum, bez_datum, event_datum), if(verg_datum < event_datum, verg_datum, event_datum))
end
id date1 date2
1 05-09-2018 01-09-2018
2 03-09-2018 06-09-2018
3 02-09-2018 07-09-2018
4 05-09-2018 null
id date1 date2 sorted on
1 05-09-2018 01-09-2018 01-09-2018
3 02-09-2018 07-09-2018 02-09-2018
2 03-09-2018 06-09-2018 03-09-2018
4 05-09-2018 null 05-09-2018
order by
least(
-- each date goes here...
-- |
-- \|/
coalesce(bez_datum, verg_datum, event_datum),
coalesce(verg_datum, bez_datum, event_datum),
coalesce(event_datum, bez_datum, verg_datum)
)
这里重要的一点是,每个日期都是其中一个合并的第一个日期。其他两个只是按任意顺序传递以合并,以确保每个合并返回一个相关的非空值(如果三个日期都为空,则返回空值)。我不确定我是否理解这个问题,但您可以使用
coalesce
选择值列表中的第一个非空值,因此您可以按合并顺序(bez_datum,verg_datum,event_datum)
使用任一日期进行排序。在我看来,您实际上想要按合并(bez_datum,verg_datum,event_datum),合并(verg_datum,event_datum)排序,event_datum
,但我不是100%确定。@GolezTrol你能解释一下它的作用吗?因为从我查找的coalesce只返回第一个非空值。但当第二个非空值较低时,我希望它优先。这段代码如何实现这一点?@GolezTrol举个id为1的行为例,我希望对这一行进行排序到2018年9月1日,因为这是最低日期,而不是到2018年9月5日,这是第一个非空值。您不能使用=
与空值相等。请改用为空
或为非空
。