基于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个日期的最早日期对表格进行排序,而不计算空值。(排序的不是应该显示的列,只是为了显示用于排序的内容)
目前,我的印象是它仅对event_datum排序。
答案 0 :(得分:1)
我认为您可以使用least
,它支持多个值。不幸的是,如果其中一个值为least
,null
总是返回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)。