2009-05-04 78 views
51

我有一个执行select语句的存储过程。我希望我的结果按日期字段排序,并首先显示所有记录为NULL的日期,然后显示最近的日期。ORDER BY DATE显示NULLS第一次然后最近的日期

声明看起来是这样的:

SELECT a,b,c,[Submission Date] 
FROM someView 
ORDER BY [Submission Date] ASC 

现在这将显示所有记录与NULL提交日期第一,但是当我到达那个在他们的日期值的行,他们是不是在最近的日期风景。

如果我用DESC替换ASC,然后按照我想要的顺序得到日期,但NULL值位于结果集的底部。

是否有任何方法来构建我的查询,以便我可以在顶部显示空值,然后当有日期值时,按顺序将它们从最近到最下面排序?

回答

85

@Chris,你差不多有它了。

ORDER BY (CASE WHEN [Submission Date] IS NULL THEN 1 ELSE 0 END) DESC, 
     [Submission Date] DESC 

[编辑:#Eppz问我要调整上面显示目前代码]

我个人比较喜欢这个有很多比创建“幻数”更好。魔术数字几乎总是一个等待发生的问题。

3

尝试

SELECT a,b,c,[Submission Date] 
FROM someView 
ORDER BY isnull([Submission Date],cast('2079/01/01' as datetime)) ASC 
+0

9999/99/99与抛出一个错误,因为它不能被解析到一个日期。 – Eppz 2009-05-04 20:19:27

+0

我会用这个解决方案而不是案例。 – Ionic 2015-06-28 20:06:57

+0

可以在LINQ – yoohoo 2016-09-02 18:33:29

21

你可以做这样的事情放在空的底部:

ORDER BY [Submission Date] IS NULL DESC, [Submission Date] ASC 
+0

+1中轻松使用,这是我在Access SQL中唯一的解决方案。 – 2013-06-10 14:13:39

+1

这也适用于SQLite。 – IAmKale 2013-08-30 20:22:12

+0

是否有任何理由你有方括号? – AndrewBramwell 2016-05-11 12:46:34

0

试试这个

选择A,B,C,[投稿日期] FROM someView ORDER BY isnull([Submissi ('1770/01/01'作为日期时间))ASC

14

标准SQL(ISO/IEC 9075-2:2003或更高版本 - 2008年)为:

ORDER BY SomeColumn NULLS FIRST 

大多数DBMS实际上并不支持这个呢,据我所知。

1
OrderBy="ColumnName = NULL desc, ColumnName desc" 
0

我知道这是旧的,但是当我发现我注意到接受的解决方案,https://stackoverflow.com/a/821856/7177892,可以通过将CASE语句是不是今天(GETDATE())或实际日期的结果进行简化。

原文:

ORDER BY (CASE WHEN [Submission Date] IS NULL THEN 1 ELSE 0 END) DESC, 
     [Submission Date] DESC 

简体:

ORDER BY (CASE WHEN [Submission Date] IS NULL 
       THEN GETDATE() 
       ELSE [Submission Date] 
      END) DESC 
相关问题