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

377
我有一个带有日期时间字段的SQL表格。该字段可以为空。我有一个查询,我想按照日期时间字段进行升序排序,但我希望日期时间字段为空的行出现在列表的最后而不是最前面。
是否有简单的方法来实现这个需求?

6
可以使用 SQL 按日期排序,但将空日期放在结果的末尾吗? - Bill Karwin
请参见https://dev59.com/r2Up5IYBdhLWcg3wrY9p#35494930和https://code.djangoproject.com/ticket/13312。 - Risadinha
15个回答

4
使用“case”语句的解决方案是通用的,但不要使用索引。
order by case when MyDate is null then 1 else 0 end, MyDate

在我这种情况下,我需要高性能。
 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
如果你对性能感兴趣,那么你应该使用 UNION ALL - D'Arcy Rittich

4
感谢 RedFilter 提供了优秀的解决方案,解决了可空日期时间字段排序问题。
我正在使用 SQL Server 数据库进行项目开发。
将日期时间空值更改为“1”可以解决日期时间数据类型列的排序问题。但是,如果我们有其他数据类型的列,则无法处理。
为了处理 varchar 列排序,我尝试使用“ZZZZZZZ”,因为我知道该列没有以“Z”开头的值。它按预期工作。
在同样的思路下,我对 int 和其他数据类型使用最大值+1 来获得所需的排序结果。这也给了我需要的结果。
然而,在数据库引擎中获得类似以下内容的更简单的东西总是理想的:
Order by Col1 Asc Nulls Last, Col2 Asc Nulls First 

如 a_horse_with_no_name 提供的答案中所述。


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

0
使用NVL函数
  select * from MyTable order by NVL(MyDate, to_date('1-1-1','DD-MM-YYYY'))

这里是大多数知名数据库中NVL的替代方法的介绍


0
我在处理包含NULL或空值的VARCHAR字段时,使用了一种对我有效的MySql秘籍:
SELECT * FROM tablename
ORDER BY 
    CASE 
        WHEN somefield IS NULL THEN 1 
        WHEN somefield = '' THEN 2
        ELSE 0 
    END, 
    somefield;

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接