【问题标题】:ORDER BY DATE showing NULLS first then most recent datesORDER BY DATE 首先显示 NULLS,然后是最近的日期
【发布时间】:2010-10-23 17:39:38
【问题描述】:

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

语句如下所示:

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

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

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

有什么方法可以构造我的查询,以便我可以在顶部显示空值,然后在有日期值时,按从最新到最旧的顺序对它们进行排序?

【问题讨论】:

    标签: sql-server sql-server-2000


    【解决方案1】:

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

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

    【讨论】:

      【解决方案2】:

      我还有一个可能比其他所有建议都简单的建议:

      对于 SQL Server,大多数选项都不起作用,除了 case 选项。

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

      在查询的顺序位中,我将 GETDATE() 值分配给为空的 Submittion_Date 值,并且顺序正确输出。

      【讨论】:

        【解决方案3】:

        我知道这是旧的,但当我发现它时,我注意到接受的解决方案 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
        

        【讨论】:

        • 如果您有今天日期或未来日期的记录,则此简化不会按原样工作。在这种情况下,您可以从 GETDATE() 更改为 DATEADD() 并在当前日期添加一些非常大的天数或年数。
        【解决方案4】:
        OrderBy="ColumnName = NULL desc, ColumnName desc"
        

        【讨论】:

          【解决方案5】:

          @Chris,你几乎拥有它。

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

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

          我个人更喜欢创建“幻数”。幻数几乎总是一个等待发生的问题。

          【讨论】:

          • 为什么要使用 DESC?只需切换您的 0 和 1。
          • 很明显,但我试图让我的编辑尽可能接近 Chris 的建议。
          • 其实我没看标签就知道是针对sql2000的。我的应该在 MySQL 中工作。 :)
          • @Chris:是的,我以前做过。你为什么不编辑你的帖子来注意这一点?在其他风格的 SQL 下发布语法没有错。
          • 感谢您的回答。我通过使用此解决方案使其工作,请编辑您的代码如下所示: ORDER BY (CASE WHEN [Submission Date] IS NULL THEN 1 ELSE 0 END) DESC, [Submission Date] DESC
          【解决方案6】:

          试试这个

          选择 a,b,c,[提交日期] 从 一些视图 订购方式 isnull([提交日期] ,cast('1770/01/01' as datetime)) ASC

          【讨论】:

            【解决方案7】:

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

            ORDER BY SomeColumn NULLS FIRST
            

            大多数 DBMS 实际上还不支持此功能,AFAIK。

            【讨论】:

            • postgres 现在支持这个
            • "Yet" cmets 在编写时可能是准确的,而在十几年后准确度会降低。
            【解决方案8】:

            试试

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

            【讨论】:

            • 9999/99/99 会抛出错误,因为它无法解析为日期。
            • 我会使用这个解决方案而不是案例。
            • 可以在LINQ中轻松使用
            【解决方案9】:

            您可以这样做,将 NULL 放在底部:

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

            【讨论】:

            • +1 这是我在 Access SQL 中唯一有效的答案。
            • 你有方括号有什么原因吗?
            • @AndrewBramwell 方括号在列名包含嵌入空格时提供帮助
            • @brewmanz 空白??你的意思是像一个空格,例如“列名”?
            • @AndrewBramwell 是的,如果你有一个像“我的列”这样的列名,你需要方括号来访问它:SELECT [My Column] ....
            猜你喜欢
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 2011-04-10
            • 1970-01-01
            • 2019-10-14
            • 1970-01-01
            • 2011-08-18
            • 2013-09-28
            相关资源
            最近更新 更多