按日期排序显示NULLS首先是最近的日期

时间:2009-05-04 20:10:33

标签: sql-server sql-server-2000

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

声明如下:

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

现在这将首先显示所有带有空提交日期的记录,但是当我到达其中包含日期值的行时,它们不是视图中的最新日期。

如果我用DESC替换ASC,那么我按照我想要的顺序获取日期,但NULL值位于我的结果集的底部。

有没有办法构建我的查询,以便我可以在顶部显示空值,然后在有日期值时,按顺序将它们降序为最近的到最早的?

9 个答案:

答案 0 :(得分:99)

@Chris,你几乎拥有它。

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

[编辑:#Eppz让我调整上面的代码,如当前所示]

我个人比创建“魔术数字”要好得多。魔术数字几乎总是等待发生的问题。

答案 1 :(得分:25)

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

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

答案 2 :(得分:17)

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

ORDER BY SomeColumn NULLS FIRST

大多数DBMS实际上并不支持这个,AFAIK。

答案 3 :(得分:3)

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

答案 4 :(得分:1)

OrderBy="ColumnName = NULL desc, ColumnName desc"

答案 5 :(得分:0)

试试这个

  

选择a,b,c,[提交日期]   从   someView   订购   isnull([提交日期],演员('1770/01/01'作为日期时间))ASC

答案 6 :(得分:0)

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

原件:

add_nums

简化为:

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

答案 7 :(得分:0)

我还有一个建议可能比其他建议更简单:

对于SQL Server,除大小写选项外,大多数选项均无效。

我发现这实际上对我很有用: ORDER BY ISNULL(Submission_Date,GETDATE())DESC

在查询的顺序位中,我将GETDATE()值分配给null的Submittion_Date值,然后顺序正确显示。

答案 8 :(得分:0)

假设提交日期小于当前日期时间

SELECT a,b,c,[Submission Date]
FROM someView
ORDER BY ISNULL([Submission Date], GETDATE()) DESC