ORDER BY时间戳,在未来和过去之间使用NULL

时间:2011-11-04 22:42:18

标签: mysql sql query-optimization

我想按时间戳字段按顺序排序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。

4 个答案:

答案 0 :(得分:4)

最简单的版本应该是:

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;

FALSETRUE之前排序,因此我们需要先DESC对点击进行排序。
阅读special value "Zero" in MySQL in the manual

答案 1 :(得分:2)

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,并按此顺序排列。

答案 2 :(得分:1)

SELECT * FROM TABLE IF(mytime is null, [sometime],mytime) ORDER BY ...

不是100%确定'是否为'是代码,但我做了类似的事情。

答案 3 :(得分:1)

我不确定这种语法是否有效,但我认为这是一个想法......

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