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 索引