SQL Server等于Oracle的NULLS FIRST?

因此,Oracle具有NULLS FIRST,我可以使用它在顶部将null值排序,然后将我的列值降序排列:

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

还有其他吗?

OMG Ponies asked 2020-06-27T12:14:00Z
8个解决方案
67 votes

您可以做一些技巧:

ORDER BY (CASE WHEN [Order] IS NULL THEN 0 ELSE 1 END), [Order] 
Lukasz Lysik answered 2020-06-27T12:14:14Z
12 votes

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

  • DESC +空值先:

    NULLS FIRST

  • ASC + NULLS LAST:

    NULLS FIRST

  • ASC +空值优先:默认情况下正常运行

  • DESC + NULLS LAST:默认情况下正常运行

让我们看看为什么:

如果您检查ORDER BY子句(Transact-SQL)MSDN文档,并向下滚动到NULLS FIRST,则可以阅读以下内容:

ASC | 数据中心

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

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

因此,您只需要按29414212620122012025的顺序更改NULLS FIRST的行为,并按ASC的顺序更改NULLS LAST的行为。

恕我直言,在必要情况下更改空值顺序的最佳解决方案是被接受的解决方案,但是我在回答的开头就将其适应于不同情况。

JotaBe answered 2020-06-27T12:15:32Z
5 votes

用例/当语句,例如:

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
Novitzky answered 2020-06-27T12:16:01Z
4 votes

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

由IsNull(Date_Sent,'17530101')desc排序

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

G Mastros answered 2020-06-27T12:16:30Z
4 votes

一个简单的例子:

SELECT (CASE WHEN Value1 IS NULL THEN 1 ELSE 0 END) AS ValueIsNull, Value1, Value2, Value3
FROM TableName
ORDER BY ValueIsNull DESC, Value1 
Jonatas Sellos answered 2020-06-27T12:16:50Z
3 votes
ORDER BY
  COALESCE(POSTING_DATE,'1900-01-01 00:00:00.000')
 ,OTHER_FIELDS
JosephStyons answered 2020-06-27T12:17:06Z
3 votes

当您要调整空值在排序顺序中的显示方式时,这是另一种方法。 否定列并反转您的排序顺序。 不幸的是,您将需要CAST dateTime列。

ORDER BY -CAST(date_sent as int) ASC
PaulG answered 2020-06-27T12:17:26Z
1 votes

据我所知,您无法控制这一点。 看来您使用ISNULL(field, '')具有正确的方法。

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

David Andres answered 2020-06-27T12:17:51Z
translate from https://stackoverflow.com:/questions/1456653/sql-server-equivalent-to-oracles-nulls-first