TSQL ORDER BY带有空的第一个或最后一个(在底部或顶部)

Myu*_*ran 24 t-sql sql-server sql-order-by isnull

我有一个日期列有一些NULL.我想按日期栏ASC订购,但我需要将NULLs放在底部.如何在TSQL上做到这一点?

Tho*_*ner 52

在标准SQL中,您可以指定放置空值的位置:

order by col asc nulls first
order by col asc nulls last
order by col desc nulls first
order by col desc nulls last
Run Code Online (Sandbox Code Playgroud)

但是T-SQL不符合这里的标准.NULL的顺序取决于您是在T-SQL中升序还是降序排序:

order by col asc -- implies nulls first
order by col desc -- implies nulls last
Run Code Online (Sandbox Code Playgroud)

使用整数,您可以简单地按负数排序:

order by -col asc -- sorts by +col desc, implies nulls first
order by -col desc -- sorts by +col asc, implies nulls last
Run Code Online (Sandbox Code Playgroud)

但是这对于日期(或者那个字符串)是不可能的,所以你必须首先排序为null /不是null,然后只有你的列:

order by case when col is null then 1 else 2 end, col asc|desc -- i.e. nulls first
order by case when col is null then 2 else 1 end, col asc|desc -- i.e. nulls last
Run Code Online (Sandbox Code Playgroud)

  • +1用于调用标准与TSQL的差异.`order by col asc`首先给出空值,`order by col desc`最后给出空值,因为SQL Server将Null值视为可能的最低值,参见[SELECT - ORDER BY子句](https://docs.microsoft.com/ EN-US/SQL/T-SQL /查询/选择顺序按子句的Transact-SQL) (8认同)
  • 喜欢整数的负数排序! (3认同)
  • 应该提到的是,“case when”解决方案会对性能产生显着的负面影响,因此不应在大型数据集上执行。([来源](https://www.dba-presents.com/index.php/databases/sql-server/36-order-by-and-nulls-last-in-sql-server)) (2认同)
  • 当对字符串做同样的事情时,任何人都会想到比以下更好的东西:“CASE WHEN col IS NULL THEN 'ZZZZZZZ' ELSE col END” (2认同)

Joh*_*tti 9

Select *
 From  YourTable
 Order By case when DateCol is null then 0 else 1 end
         ,DateCol
Run Code Online (Sandbox Code Playgroud)

甚至 Order By IsNull(DateCol,'2525-12-31')

  • 确保您记录了 500 年后需要进行的额外代码审查。技术债务真的可以加起来! (3认同)
  • “在2525年,如果人类还活着”? (2认同)