SQL Server相当于Oracle的NULLS FIRST?

时间:2009-09-21 20:26:06

标签: sql sql-server sql-server-2005 tsql

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

ORDER BY date_sent NULLS FIRST

SQL Server有什么可比性?假设日期值为NULL或过去,有这些替代方案:

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 个答案:

答案 0 :(得分:64)

你可以做一些技巧:

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

答案 1 :(得分:12)

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

  • DESC + NULLS FIRST:

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

  • ASC + NULLS LAST:

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

  • ASC + NULLS FIRST:默认情况下它可以正常工作

  • DESC + NULLS LAST:默认情况下它可以正常工作

让我们看看原因:

如果您选中ORDER BY Clause (Transact-SQL) MSDN docs,向下滚动到ASC | DESC,则可以阅读:

  

ASC | DESC

     

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

因此,默认情况下,如果您指定ASC订单,则其工作方式与NULLS FIRST相同。而且,如果您指定DESC,则其工作方式与NULLS LAST类似。

因此,您只需要更改NULLS FIRST订单中DESC的行为,以及NULLS LAST订单中ASC的行为。

恕我直言,在必要的情况下更改空值顺序的最佳解决方案是被接受的解决方案,但我已经将它包含在我的答案开头的不同情况中。

答案 2 :(得分:5)

Use Case / 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

答案 3 :(得分:4)

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

由IsNull订购(Date_Sent,'17530101')desc

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

答案 4 :(得分:4)

一个简单的例子:

SELECT (CASE WHEN Value1 IS NULL THEN 1 ELSE 0 END) AS ValueIsNull, Value1, Value2, Value3
FROM TableName
ORDER BY ValueIsNull DESC, Value1 

答案 5 :(得分:3)

ORDER BY
  COALESCE(POSTING_DATE,'1900-01-01 00:00:00.000')
 ,OTHER_FIELDS

答案 6 :(得分:3)

当您想要调整排序顺序中的空值时,这是另一种方法。取消列并反转排序顺序。不幸的是,你需要CAST dateTime列。

ORDER BY -CAST(date_sent as int) ASC

答案 7 :(得分:1)

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

对于字符串,我使用ISNULL(field, '')用于同一目的。