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)
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 FIRST的DESC顺序,并NULLS LAST在ASC顺序.
恕我直言,在必要的情况下更改空值排序的最佳解决方案是可接受的,但我已经将它包含在我的答案开头的不同情况中.
使用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)
| 归档时间: |
|
| 查看次数: |
27707 次 |
| 最近记录: |