最早使用空值对3个日期进行排序

时间:2018-09-04 14:52:36

标签: mysql

基于this问题,我编写了一段看起来像这样的代码:

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

问题是我的排序仍然没有按计划进行。当我执行此代码时,我得到以下结果: order by executed

当我有一个像这样的桌子时要清楚:

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

因此,应该在2个日期的最早日期对表格进行排序,而不计算空值。(排序的不是应该显示的列,只是为了显示用于排序的内容)

目前,我的印象是它仅对event_datum排序。

1 个答案:

答案 0 :(得分:1)

我认为您可以使用least,它支持多个值。不幸的是,如果其中一个值为leastnull总是返回null。您可以使用coalesce解决此问题。

您的order by子句可能如下所示:

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值(如果所有三个日期都为null,则返回null)。