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 LAST
或NULLS FIRST
:
使用NULLS LAST
将它们sorting到最后:
select * from some_table order by some_column DESC NULLS LAST
我也偶然发现了这一点,以下似乎对我来说,在MySQL和PostgreSQL上:
ORDER BY date IS NULL, date DESC
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, x
或ORDER BY x NULLS LAST
使用它。 但是,如果这不能帮助:
如果您按数字typessorting,则可以这样做:(从另一个答案借用模式)
SELECT * FROM Employees ORDER BY ISNULL(DepartmentId*0,1), 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 FIRST
或NULLS 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