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日,这是第一个非空值。您不能使用
=
与空值相等。请改用
为空
为非空