SQL Server相当于Oracle的NULLS FIRST?

OMG*_*ies 46 sql t-sql sql-server sql-server-2005

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

ORDER BY date_sent NULLS FIRST
Run Code Online (Sandbox Code Playgroud)

什么是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
Run Code Online (Sandbox Code Playgroud)

还有其他人?

Luk*_*sik 67

你可以做一些技巧:

ORDER BY (CASE WHEN [Order] IS NULL THEN 0 ELSE 1 END), [Order] 
Run Code Online (Sandbox Code Playgroud)

  • 通过这个技巧,您可以实现任何您想要的顺序.您甚至可以模仿许多语言中更常见的IComparer接口. (2认同)

Jot*_*aBe 13

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

  • 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从最高值到最低值排序.ASC是默认排序顺序.空值被视为最低可能值.

因此,默认情况下,如果您指定ASC顺序,它就像NULLS FIRST.而且,如果你指定DESC,它就像NULLS LAST.

所以,你只需要做改变行为NULLS FIRSTDESC顺序,并NULLS LASTASC顺序.

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


Nov*_*zky 5

使用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
Run Code Online (Sandbox Code Playgroud)

...等等.

甚至更好,因为你不关心你的列类型和最大值.

ORDER BY (case WHEN ColAnyType IS NULL THEN 1 ELSE 0 END) DESC, ColAnyType DESC
Run Code Online (Sandbox Code Playgroud)