我想按时间戳字段的降序排列SQL结果,最新的条目优先。但是,我有一些行是空白的或包含零。如何将这些结果夹在未来和过去的两行之间?CASE能做到这一点吗?
SELECT * FROM table ORDER BY when DESC
编辑:感谢所有的回复。大家都知道,我选择了MySQL的IFNULL,即
SELECT * FROM table ORDER BY IFNULL(when,UNIX_TIMESTAMP()) DESC
这是最简单的方法,如果包含NULL,则select查询将其替换为当前unix时间。请注意,我更新了数据库,并用NULL值替换了所有的0。
最简单的版本应该是:
SELECT *
FROM mytable
ORDER BY (mytime > now() AND mytime IS NOT NULL) DESC -- future times first
,(mytime IS NULL OR mytime = 0) DESC -- NULL and "zero" next
,mytime DESC; -- everything descending
或者更简单的CASE语句:
SELECT *
FROM mytable
ORDER BY CASE WHEN mytime IS NULL OR mytime = 0 THEN now() ELSE mytime END DESC;
FALSE
排序在TRUE
之前,因此我们需要DESC
首先对命中进行排序
请参阅手册中MySQL中的特殊值"零"。
SELECT *
, COALESCE(when, '2011-01-01 00:00:00') as new_when
FROM table
ORDER BY new_when DESC
关于COALESCE()
的更多信息。基本上,如果没有设置,我会使用2011-01-01 00:00:00
作为默认时间戳,所以任何带有null
的项目都将被视为该日期。我们将该日期别名为new_when
,并以此进行订购。
SELECT * FROM TABLE IF(mytime is null, [sometime],mytime) ORDER BY ...
不能100%确定"是否为null"是代码,但我也做过类似的事情。
我不确定这个语法是否有效,但我认为这就是我的想法。。。
ORDER BY
CASE WHEN mytime IS NOT NULL AND mytime > NOW() THEN 'a'
WHEN mytime IS NULL THEN 'b'
WHEN mytime IS NOT NULL AND mytime < NOW() THEN 'c'
END
, mytime