我有一个带有datetime字段的SQL表。所讨论的字段可以为空。我有一个查询,我想要的结果排序由datetime字段上升,但我想要的行,其中的datetime字段是空在列表的结束,而不是在开始。
有什么简单的方法可以做到吗?
我有一个带有datetime字段的SQL表。所讨论的字段可以为空。我有一个查询,我想要的结果排序由datetime字段上升,但我想要的行,其中的datetime字段是空在列表的结束,而不是在开始。
有什么简单的方法可以做到吗?
当前回答
在Oracle中,你可以使用NULLS FIRST或NULLS LAST:指定NULL值应该在非NULL值之前或之后返回:
ORDER BY { column-Name | [ ASC | DESC ] | [ NULLS FIRST | NULLS LAST ] }
例如:
ORDER BY date DESC NULLS LAST
裁判:http://docs.oracle.com/javadb/10.8.3.0/ref/rrefsqlj13658.html
其他回答
order by coalesce(date-time-field,large date in future)
select MyDate
from MyTable
order by case when MyDate is null then 1 else 0 end, MyDate
如果你的引擎允许ORDER BY x IS NULL, x或ORDER BY x NULLS LAST使用它。但如果没有,下面这些可能会有所帮助:
如果你是按数字类型排序,你可以这样做:(借用另一个答案的模式。)
SELECT *
FROM Employees
ORDER BY ISNULL(DepartmentId*0,1), DepartmentId;
任何非空数都变成0,nulls变成1,最后对null进行排序,因为0 < 1。
你也可以对字符串这样做:
SELECT *
FROM Employees
ORDER BY ISNULL(LEFT(LastName,0),'a'), LastName
任何非空字符串都变成'',null变成'a',它将null排在最后,因为" < 'a' "。
这甚至可以通过将date强制为可空int并使用上面的方法来处理int:
SELECT *
FROM Employees
ORDER BY ISNULL(CONVERT(INT, HireDate)*0, 1), HireDate
(让我们假设模式具有HireDate。)
这些方法避免了必须提出或管理每个类型的“最大值”的问题,或者在数据类型(和最大值)发生变化时修复查询(其他ISNULL解决方案都会遇到这两个问题)。另外,它们比CASE要短得多。
您可以使用内置函数检查null或非null,如下所示。我测试了它,它的工作良好。
select MyDate from MyTable order by ISNULL(MyDate,1)
(“有点”晚了,但这一点根本没有被提及)
您没有指定您的DBMS。
在标准SQL(以及大多数现代DBMS,如Oracle, PostgreSQL, DB2, Firebird, Apache Derby, HSQLDB和H2)中,您可以指定NULLS LAST或NULLS FIRST:
使用NULLS LAST将它们排序到最后:
select *
from some_table
order by some_column DESC NULLS LAST