为了账号安全,请及时绑定邮箱和手机立即绑定

SQL如何使空值升序排序时最后

SQL如何使空值升序排序时最后

LEATH 2019-11-22 15:15:36
我有一个带日期时间字段的SQL表。有问题的字段可以为空。我有一个查询,我希望结果按datetime字段升序排序,但是我希望datetime字段在列表的末尾而不是开头的行为null。有没有简单的方法可以做到这一点?
查看完整描述

3 回答

?
呼如林

TA贡献1798条经验 获得超3个赞

select MyDate

from MyTable

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


查看完整回答
反对 回复 2019-11-22
?
Qyouu

TA贡献1786条经验 获得超11个赞

(“位”晚了,但这一点都没有提到)


您未指定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


查看完整回答
反对 回复 2019-11-22
?
繁花不似锦

TA贡献1851条经验 获得超4个赞

如果您的引擎允许ORDER BY x IS NULL, x或ORDER BY x NULLS LAST使用。但是,如果不是这样,这些方法可能会有所帮助:


如果按数字类型排序,则可以执行以下操作:(从另一个答案借用架构。)


SELECT *          

FROM Employees

ORDER BY ISNULL(DepartmentId*0,1), DepartmentId;

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


任何非空数都将变为0,并且空值将变为1,这将最后对空值进行排序。


您还可以对字符串执行此操作:


SELECT *

FROM Employees

ORDER BY ISNULL(LEFT(LastName,0),'a'), LastName

结果显示按LastName排序,其中null为last


因为'a'> ''。


这甚至可以通过强制为可为null的int并将上述方法用于int来处理日期:


SELECT *

FROM Employees

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

(假设该模式具有HireDate。)


这些方法避免了必须提出或管理每种类型的“最大值”值或在数据类型(和最大值)发生更改时修复查询的问题(这是其他ISNULL解决方案所遇到的问题)。另外,它们比CASE短得多。


查看完整回答
反对 回复 2019-11-22
  • 3 回答
  • 0 关注
  • 1437 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信