三个领域:
Activity (varchar), Arrival (time), Departure (time)
我正在尝试生成这样的输出表:
Activity Arrival Departure
Travel to Hotel 9:00 -
Depart Hotel for Big Ben - 10:00
Sight-seeing Big Ben 12:00 13:00
-
表示我的表中的NULL
值。
我目前正在查询我的查询:
ISNULL(Activity.arrival), Activity.arrival ASC
在提供抵达日期时效果很好。当arrival
为null
时,我最终会得到一张像这样的表
Activity Arrival Departure
Travel to Hotel 9:00 -
Sight-seeing Big Ben 12:00 13:00 // problem!
Depart Hotel for Big Ben - 10:00 // should be up one.
我不确定我是否可以使用纯SQL实现此目的。
正在进行的查询是:
SELECT `id`, `activity`, `arrival`, `departure` FROM `activities` ORDER BY ISNULL(`arrival`) ASC, `arrival` ASC
我只是在输出:
foreach($r as $k) {
echo $k['activity'] . ' ' . $k['arrival'] . ' ' . $k['departure'];
}
我是否需要在输出处理它?</ p>
感谢您的任何见解。
答案 0 :(得分:3)
您可以使用COALESCE()
这将返回第一个非空值。
ORDER BY COALESCE(Activity.arrival, Activity.departure)
答案 1 :(得分:1)
你可以使用: -
ORDER BY IFNULL(Activity.arrival, Activity.departure)
答案 2 :(得分:1)
没试过,但我觉得这样的事情会奏效:
SELECT `id`, `activity`, `arrival`, `departure`
FROM `activities`
ORDER BY
CASE WHEN `arrival` IS NULL THEN `departure` END ASC,
`departure` ASC
;
答案 3 :(得分:1)
您的问题主要来自于您希望如何排序的模糊性。如果您可以指定要排序的规则,则可以轻松地在SQL中对该规则进行编码。
例如,我可能会猜到,如果到达不为空,请按到货排序。如果抵达时间不为空,请使用出发时间,以便出发在下次抵达时间之前。这对你有用吗?
如果是这种情况,解决方案就变得明显了:
order by coalesce(arrival, departure)
意思是如果到达为空,请改用离开。