ORDER BY 时间戳,未来和过去之间为 NULL

Posted

技术标签:

【中文标题】ORDER BY 时间戳,未来和过去之间为 NULL【英文标题】:ORDER BY timestamp with NULLs between future and past 【发布时间】:2011-11-04 22:42:17 【问题描述】:

我想按时间戳字段以降序排列 SQL 结果,最新条目在前。但是,我有某些行是空白的或包含零。如何将这些结果夹在未来行和过去行之间?这可以用 CASE 来完成吗?

SELECT * FROM table ORDER BY when DESC

编辑:感谢所有回复。众所周知,我选择了 mysql 的 IFNULL,即

SELECT * FROM table ORDER BY IFNULL(when,UNIX_TIMESTAMP()) DESC

这是最简单的方法,如果包含 NULL,则选择查询将其替换为当前的 unix 时间。请注意,我更新了我的数据库并将所有 0 替换为 NULL 值。

【问题讨论】:

【参考方案1】:

最简单的版本应该是:

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 对匹配项进行排序。 阅读special value "Zero" in MySQL in the manual。

【讨论】:

感谢“FALSE 在 TRUE 之前排序”、“mytime IS NULL”解决了我的问题 :-)【参考方案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 并按此排序。

【讨论】:

不错,但有两个缺点:未能动态处理“现在”,未能按要求观察“零”。【参考方案3】:
SELECT * FROM TABLE IF(mytime is null, [sometime],mytime) ORDER BY ...

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

【讨论】:

所以基本上如果它为 NULL(或零,或其他),我应该为其分配当前时间......这将通过简单的 DESC 排序将其置于中间。 IS NULL 是正确的。然后您可以将[sometime] 替换为NOW() 以使用当前时间。 @user984512,更新表中的值(以及通过设置默认值等来更新未来的值)不同于在过去和未来之间设置 NULL。【参考方案4】:

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

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

【讨论】:

以上是关于ORDER BY 时间戳,未来和过去之间为 NULL的主要内容,如果未能解决你的问题,请参考以下文章

时间戳字段上的 ORDER BY 使我的查询变慢。如何优化它?

HSQLDB 中 WHERE 和 ORDER BY 的性能问题

在 where 子句和 order by 子句之间的 MySQL 索引

加速使用 Group By 和 Order By 的多表 Mysql 查询

order by 与group by 之间排序问题

数据仓库:从过去到未来(上)