代码之家  ›  专栏  ›  技术社区  ›  OMG Ponies

SQL Server是否首先等效于Oracle的nulls?

  •  44
  • OMG Ponies  · 技术社区  · 15 年前

    所以Oracle首先有空值,我可以使用它将空值排序在顶部,然后按降序排列我的列值:

    ORDER BY date_sent NULLS FIRST
    

    在SQL Server中有什么可比性?假设日期值为空或过去,则有以下选项:

    ORDER BY ISNULL(date_sent, GETDATE()) DESC
    ORDER BY (CASE WHEN t.setinactive IS NULL THEN 1 ELSE 2 END), t.setinactive DESC
    ORDER BY -CAST(date_sent as int) ASC
    

    还有其他的吗?

    8 回复  |  直到 10 年前
        1
  •  62
  •   Lukasz Lysik    15 年前

    你可以做一些技巧:

    ORDER BY (CASE WHEN [Order] IS NULL THEN 0 ELSE 1 END), [Order] 
    
        2
  •  11
  •   JotaBe    10 年前

    快速的答案是:在必要的情况下,更改空值顺序的最佳解决方案是接受的解决方案。但是你只需要在必要的情况下使用它,或者使用它的变体:

    • 先描述+空值:

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

    • 最后为asc+空值:

      ORDER BY (CASE WHEN [Order] IS NULL THEN 1 ELSE 0 END), [Order] ASC

    • asc+nulls优先:默认情况下工作正常

    • desc+nulls last:默认情况下工作正常

    让我们来看看为什么:

    如果你检查 ORDER BY Clause (Transact-SQL) MSDN docs ,向下滚动至 ASC | DESC ,您可以阅读:

    ASC

    指定指定指定列中的值应按升序或降序排序。asc从最低值到最高值排序。DESC从最高值到最低值排序。asc是默认的排序顺序。空值被视为尽可能低的值。

    因此,默认情况下,如果指定 ASC 命令,它的工作方式 NULLS FIRST . 如果您指定 DESC 它的工作原理是 NULLS LAST .

    所以你只需要改变 第一空值 在里面 DESC 秩序,为了 最后的零值 在里面 ASC公司 秩序。

    imho,在必要的情况下更改nulls顺序的最佳解决方案是接受的解决方案,但我在回答的开头已经将它包括在适应不同情况的情况中。

        3
  •  5
  •   Novitzky    15 年前

    用例/when语句,例如:

    ORDER BY (case WHEN ColINT IS NULL THEN {maxIntValue} ELSE ColINT END) DESC
    
    ORDER BY (case WHEN ColVChar IS NULL THEN {maxVCharValue} ELSE ColVChar END) DESC
    
    ORDER BY (case WHEN ColDateT IS NULL THEN {maxDateTValue} ELSE ColDateT END) DESC
    

    等等…

    或者更好,因为您不关心列类型和最大值是什么。

    ORDER BY (case WHEN ColAnyType IS NULL THEN 1 ELSE 0 END) DESC, ColAnyType DESC
    
        4
  •  4
  •   George Mastros    15 年前

    如果表中的行的日期小于现在,而其他行的日期大于现在,则空值将显示在列表的中间。相反,您应该使用一个永远不会在列表中间排序的值。

    订购人IsNull(发送日期,'17530101')描述

    注:该日期实际上是1753年1月1日。

        5
  •  4
  •   Jonatas Sellos    14 年前

    一个简单的例子:

    SELECT (CASE WHEN Value1 IS NULL THEN 1 ELSE 0 END) AS ValueIsNull, Value1, Value2, Value3
    FROM TableName
    ORDER BY ValueIsNull DESC, Value1 
    
        6
  •  3
  •   JosephStyons    15 年前
    ORDER BY
      COALESCE(POSTING_DATE,'1900-01-01 00:00:00.000')
     ,OTHER_FIELDS
    
        7
  •  3
  •   PaulG    15 年前

    当您想调整空值在排序顺序中的显示方式时,这是一种可选的方法。否定列并颠倒排序顺序。不幸的是,您需要强制转换日期时间列。

    ORDER BY -CAST(date_sent as int) ASC
    
        8
  •  1
  •   David Andres    15 年前

    据我所知,你无法控制这一切。看起来你有正确的方法 ISNULL .

    我用了弦 ISNULL(field, '') 为了同样的目的。