所以甲骨文有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
任何其他方面?
你可以做一些技巧:
ORDER BY (CASE WHEN [Order] IS NULL THEN 0 ELSE 1 END), [Order]
简单的回答是这样的:改变零点的顺序在必要的情况下,最好的解决办法是接受一个。 但是,你只需要使用它,或者它在必要情况下的变化:
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子句(Transact-SQL)MSDN文档 ,然后向下滚动到ASC | DESC
ASC | DESC
,你可以这样说的:
ASC | DESC
指定在指定列中的值应以升序或降序排序。 ASC排序从最低值到最高值。 降序排序,从最高值到最低值。 ASC是默认的排序顺序。 Null值被视为可能的最低值。
因此,在默认情况下,如果你指定ASC
秩序,它就像NULLS FIRST
。 而且,如果你指定DESC
,它的工作原理是NULLS LAST
。
所以,你只需要做改变的行为, NULLS FIRST
在DESC
顺序,并NULLS LAST
在ASC
顺序。
恕我直言,改变零点的顺序在必要的情况下,最好的解决办法是接受的,但我已经包括在我回答的开头适应不同的情况。
用例/ 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
如果你有一个日期比现在更大的日期在你的表行不到现在,和其他行,你会NULLS出现在列表的中间。 相反,你应该使用的是不会在你的列表中间进行排序的值。
通过ISNULL(DATE_SENT, '17530101')令递减
注意:这个日期实际上是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
这是当你要调整零点如何出现在排序顺序的另一种方式。 否定柱和反向您的排序顺序。 不幸的是,你需要投datetime列。
ORDER BY -CAST(date_sent as int) ASC
你无法控制这一点,据我所知。 它看起来像你有一个正确的做法ISNULL
。
随着琴弦,我使用ISNULL(field, '')
为了同样的目的。