我想按时间戳字段按顺序排序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。
答案 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;
FALSE
在TRUE
之前排序,因此我们需要先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