SQL如何使sorting升序时为空值最后

我有一个date时间字段的SQL表。 有问题的字段可以为空。 我有一个查询,我希望按date时间字段递增sorting的结果,但是我想要的行的date时间字段在列表的末尾,而不是在开始。

有没有一个简单的方法来完成呢?

select MyDate from MyTable order by case when MyDate is null then 1 else 0 end, MyDate 

(一点点迟到,但是根本没有提到)

你没有指定你的DBMS。

在标准SQL(以及大多数现代DBMS,如Oracle,PostgreSQL,DB2,Firebird,Apache Derby,HSQLDB和H2)中,您可以指定NULLS LASTNULLS FIRST

使用NULLS LAST将它们sorting到最后:

 select * from some_table order by some_column DESC NULLS LAST 

我也偶然发现了这一点,以下似乎对我来说,在MySQL和PostgreSQL上:

 ORDER BY date IS NULL, date DESC 

https://stackoverflow.com/a/7055259/496209所示;

 order by coalesce(date-time-field,large date in future) 

您可以使用内置函数来检查是否为null,如下所示。 我testing它,它的工作正常。

select MyDate from MyTable order by ISNULL(MyDate,1) DESC, MyDate ASC;

 SELECT * FROM Employees ORDER BY ISNULL(DepartmentId, 99999); 

看到这个博客文章 。

如果你的引擎允许ORDER BY x IS NULL, xORDER BY x NULLS LAST使用它。 但是,如果这不能帮助:

如果您按数字typessorting,则可以这样做:(从另一个答案借用模式)

 SELECT * FROM Employees ORDER BY ISNULL(DepartmentId*0,1), DepartmentId; 

结果显示按DepartmentId排序,最后为空

任何非空的数字变为0,而空值变为1,最后将空值sorting。

你也可以为string做这个:

 SELECT * FROM Employees ORDER BY ISNULL(LEFT(LastName,0),'a'), LastName 

结果显示按姓氏排序,最后一个为空

因为'a' > ''

这甚至可以通过强制使用int来实现,并使用上面的int方法:

 SELECT * FROM Employees ORDER BY ISNULL(CONVERT(INT, HireDate)*0, 1), HireDate 

(假设模式有HireDate。)

这些方法避免了如果数据types(和最大值)改变(其他ISNULL解决scheme受到影响的问题),必须提出或pipe理每种types的“最大”值或修复查询的问题。 再加上它们比CASE短得多。

感谢RedFilter提供优秀的解决sorting可空date时间字段的问题。

我正在为我的项目使用SQL Server数据库。

将datetime空值更改为“1”的确解决了datetime数据types列的sorting问题。 但是,如果我们有不同于datetime数据types的列,那么它将无法处理。

为了处理一个varchar列sorting,我试着用'ZZZZZZZ',因为我知道列没有以'Z'开始的值。 它按预期工作。

同样的,我使用int和其他数据types的最大值+1来得到预期的sorting。 这也给了我需要的结果。

但是,在数据库引擎本身中可以做一些事情比较容易:

 Order by Col1 Asc Nulls Last, Col2 Asc Nulls First 

正如a_horse_with_no_name提供的答案中所述。

 order by -cast([nativeDateModify] as bigint) desc 

使用“case”的解决scheme是通用的,但是不要使用索引。

 order by case when MyDate is null then 1 else 0 end, MyDate 

就我而言,我需要performance。

  SELECT smoneCol1,someCol2 FROM someSch.someTab WHERE someCol2 = 2101 and ( someCol1 IS NULL ) UNION SELECT smoneCol1,someCol2 FROM someSch.someTab WHERE someCol2 = 2101 and ( someCol1 IS NOT NULL) 

当你的订单栏是数字(如排名),你可以乘以-1,然后降序。 它会保持你所期望的顺序,但最后放置NULL。

 select * from table order by -rank desc 

使用NVLfunction

  select * from MyTable order by NVL(MyDate, to_date('1-1-1','DD-MM-YYYY')) 

在大多数着名的DBMS中,这是NVL的替代scheme

在Oracle中,可以使用NULLS FIRSTNULLS LAST :指定应在非NULL值之前/之后返回NULL值:

 ORDER BY { column-Name | [ ASC | DESC ] | [ NULLS FIRST | NULLS LAST ] } 

例如:

 ORDER BY date DESC NULLS LAST 

Ref: http : //docs.oracle.com/javadb/10.8.3.0/ref/rrefsqlj13658.html