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

时间:2017-03-23 20:48:39

标签: sql-server tsql sql-order-by isnull

我的日期列有一些NULL。我想按日期栏ASC订购,但我需要NULL s在底部。如何在 TSQL 上执行此操作?

5 个答案:

答案 0 :(得分:39)

在标准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

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

order by col asc -- implies nulls first
order by col desc -- implies nulls last

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

order by -col asc -- sorts by +col desc, implies nulls first
order by -col desc -- sorts by +col asc, implies nulls last

但是这对于日期(或者那个字符串)来说是不可能的,所以你必须首先排序为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

答案 1 :(得分:6)

Select *
 From  YourTable
 Order By case when DateCol is null then 1 else 0 end
         ,DateCol

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

答案 2 :(得分:0)

order by case when col_name is null then 1 else 2 end, col_name asc在Oracle上做了伎俩。但是,MS SQL Server上的相同内容会将NULL记录向下推,而将非null保留在结果集的顶部。

答案 3 :(得分:0)

这对我来说是成功的窍门。幸运的是,我正在处理文本。对于任何数字,我可能都会选择全9。 COALESCE(c.ScrubbedPath,'zzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzz')

答案 4 :(得分:0)

有时,您可能需要使用子查询来做到这一点:

protected override void OnStop()
{
    try
    {
        client.Close();
        _shutdownEvent.Set();
        hli_worker.Join(2000);
    }
    catch (Exception e)
    {
        ...
    }
}