Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/sql/72.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
SQL Server相当于Oracle';谁先为空?_Sql_Sql Server_Sql Server 2005_Tsql - Fatal编程技术网

SQL Server相当于Oracle';谁先为空?

SQL Server相当于Oracle';谁先为空?,sql,sql-server,sql-server-2005,tsql,Sql,Sql Server,Sql Server 2005,Tsql,所以Oracle首先有空值,我可以使用空值在顶部排序,然后按降序排列我的列值: 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 B

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

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

还有其他的吗?

据我所知,这是你无法控制的。看起来您使用
ISNULL
的方法是正确的


对于字符串,我使用了
ISNULL(字段“”)
,用于相同的目的。

用例/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
你可以做一些技巧:

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

如果您的表中的日期小于现在的行,并且其他日期大于现在的行,则您的空值将出现在列表的中间。相反,您应该使用一个在列表中间不会排序的值。 IsNull(发送日期,'17530101')说明下的订单


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

当您想要调整空值在排序顺序中的显示方式时,这是另一种方法。对列求反并反转排序顺序。不幸的是,您需要强制转换dateTime列

ORDER BY
  COALESCE(POSTING_DATE,'1900-01-01 00:00:00.000')
 ,OTHER_FIELDS
ORDER BY -CAST(date_sent as int) ASC
一个简单的例子:

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

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

  • DESC+先为空:

    ORDER BY(如果[ORDER]为空,则0,否则1结束),[ORDER]DESC

  • ASC+最后为空:

    ORDER BY(当[ORDER]为空时,则为1,否则为0结束),[ORDER]ASC

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

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

让我们看看原因:

如果选中,并向下滚动至
ASC | DESC
,您可以阅读以下内容:

ASC |描述

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

因此,默认情况下,如果指定
ASC
顺序,它的工作方式类似于
NULLS FIRST
。而且,如果您指定
DESC
,它的工作方式类似于
NULLS LAST

因此,您只需在
DESC
顺序中更改
NULLS FIRST
的行为,并在
ASC
顺序中更改
NULLS LAST
的行为


IMHO,在必要的情况下,改变空值顺序的最佳解决方案是公认的,但我在回答的开始部分已将其包括在不同的情况下。

Kev:这一切都取决于手头问题的性质。问题不是“这是所有情况下都要使用的ORDER BY子句吗?”因此,G Mastros观点得到了很好的注意,但并不是严格意义上的问题本身的关键路径。rexem正在寻找一种更全局的方法来控制空排序。Order by IsNull(Date_Sent,'17530101')desc将确保我的列(带有空Date_Sent值)显示在底部,而不是顶部。你是对的,但我并没有到未来去设定日期(发送值=)好的观点,但原则仍然成立。您应该使用数据中不会自然出现的值。例如:Order by IsNull(Date_Sent,'9990101')DESC完全同意使用sentinel值。不起作用-空值是第一个,但其余的Date_Sent列不按DESC顺序排序。已确认:空值位于顶部,非空值按DESC顺序排列。使用此技巧可以实现任何您想要的排序。您甚至可以模仿许多语言中更通用的IComparer界面。请记住,如果以前使用索引,这会严重降低性能,因为现在必须手动对结果排序。