SQL Server相当于Oracle的NULLS FIRST?

因此,Oracle有NULLS FIRST,我可以使用空值在顶部sorting,然后按降序排列我的列值:

ORDER BY date_sent NULLS FIRST 

在SQL Server中有什么可比的? 假设date值为NULL或过去有以下替代scheme:

 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 Solutions collect form web for “SQL Server相当于Oracle的NULLS FIRST?”

你可以做一些技巧:

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

快速的答案是:在必要的情况下改变空值的sorting的最佳解决scheme是被接受的。 但是你只需要在必要的情况下使用它,或者使用它的一个变种:

  • DESC + NULLS第一:

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

  • ASC + NULLS最后:

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

  • ASC + NULLS FIRST:默认工作正常

  • DESC + NULLS LAST:默认工作正常

让我们看看为什么:

如果您检查ORDER BY子句(Transact-SQL)MSDN文档 ,并向下滚动到ASC | DESC ASC | DESC ,你可以阅读这个:

ASC | DESC

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

所以,默认情况下,如果你指定ASC顺序,它就像NULLS FIRST一样工作。 而且,如果你指定了DESC ,它就像NULLS LAST一样工作。

所以你只需要在DESC顺序中改变NULLS FIRST的行为,并且在ASC顺序中改变NULLS LAST

恕我直言,在必要情况下改变空值sorting的最佳解决scheme是可以接受的,但是在我的回答开头,我已经将它包含在不同的案例中。

用例/当语句,例如:

 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 

…等等。

甚至更好,因为你不关心你的列types和最大值。

 ORDER BY (case WHEN ColAnyType IS NULL THEN 1 ELSE 0 END) DESC, ColAnyType DESC 

如果表中的行数小于现在的date,而其他date大于现在的行,则NULLS将显示在列表的中间。 相反,你应该使用一个永远不会在列表中sorting的值。

按IsNullsorting(Date_Sent,'17530101')desc

注意:那个date实际上是1753年1月1日。

一个简单的例子:

 SELECT (CASE WHEN Value1 IS NULL THEN 1 ELSE 0 END) AS ValueIsNull, Value1, Value2, Value3 FROM TableName ORDER BY ValueIsNull DESC, Value1 
 ORDER BY COALESCE(POSTING_DATE,'1900-01-01 00:00:00.000') ,OTHER_FIELDS 

当您想要调整sorting顺序中空值的显示方式时,这是一种替代方法。 取消列并颠倒你的sorting顺序。 不幸的是,你需要CAST dateTime列。

 ORDER BY -CAST(date_sent as int) ASC 

据我所知,你无法控制这个。 而且看起来你有正确的方法与ISNULL

对于string,我使用了ISNULL(field, '')来达到同样的目的。

  • 删除SQL Server中的重复logging?
  • 了解T-SQL中的PIVOTfunction
  • T-SQLdynamic数据透视表
  • 何时使用通用expression式(CTE)
  • 如何在SQL Server数据库中一次性删除所有存储过程?
  • 表名称作为variables
  • TSQL枢轴多列
  • 在SQL Server 2008中只比较两个DATETIME,而不是date
  • SQL Server 2008上的唯一键与唯一索引
  • 从表中删除标识
  • 如何强制SQL Server 2008数据库脱机