基于 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
问题是我的排序仍然没有按计划进行。当我执行这段代码时,我得到了这个结果:
当我有一个看起来像这样的表时要清楚:
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 个日期中最早的日期排序,而不是计算 null。(排序依据不是应该显示的列,它只是为了显示用于排序的内容)
目前我的印象是它只对 event_datum 进行排序。
最佳答案
我想你可以使用 least
,它支持多个值。不幸的是,如果其中一个值为 null
,least
总是返回 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)。
关于mysql - 对具有空值的 3 个日期中最早的日期进行排序,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/52169005/