如何对末尾为 NULL 值的列进行升序排序?

How to sort a column in ascending order with NULL values at the end?

我正在使用个人数据库来跟踪我的项目。

我在 table 中有一个名为 StartDate 的 date/time 列,我在用作我所在表单的数据源的查询中按升序排序m 输入数据。

该表格是一个拆分表格,以 table 格式显示 "Detail" 部分中的数据。

到目前为止,我都是在分配项目时输入的,但我现在还需要跟踪将要分配但尚未分配的常见项目。

为了跟踪这个,我想输入没有开始日期的未来项目。

但是,当我这样输入记录时,它们被排序到顶部而不是我喜欢的列表底部。

是否有任何方法可以覆盖排序,以便在 StartDate 列中具有值的记录按升序排序,但在 StartDate 列中没有值的记录将排在末尾?

谢谢!

您可以创建一个计算字段来排序您的数据。

我用日期做了一个简单的 table(名为 tbl),其中一些带有空白:

如您所见,ID 为 4,5 和 9 的行在 StartDate

中为空白

然后我用一个计算字段组成了一个查询,该查询将检查字段 StartDate 是否不是 空白。如果为真,return 0,如果为假,return 1。这样所有空白 Startdate 行将 return 1,非空白行将 return 0。然后订购首先按此计算字段排序,然后按 StartDate 作为二阶字段排序。

计算字段的公式为:IIf(IsNull([StartDate])=False,0,1)

查询的SQL代码为:

SELECT tbl.startdate, tbl.id
FROM tbl
ORDER BY IIf(IsNull([StartDate])=False,0,1), tbl.startdate

我得到这个作为输出:

如您所见,ID 为 4,5 和 9 的行在 StartDate 中为空白,它们位于记录集的底部。

希望您能根据自己的需要进行调整。

一种可能是按此排序:

ORDER BY Nz([StartDate], CDate("31.12.2999"))

这里函数NZ用于将Null值('on the fly',仅在查询中)转换为日期31.12.2999,所以排序如你所愿。

如果您在日期字段上计算任何内容,您将失去对它的索引的使用。

所以检查 Null:

SELECT 
    startdate, id
FROM 
    YourTable
ORDER BY
    StartDate Is Null,
    StartDate

Gustav 的解决方案很棒;但是,它有一个限制。在我的 MS Access 查询中,我在 SELECT 子句中有一个 DISTINCT 来消除重复行,并且在使用此解决方案时,它 returns 错误: “ORDER BY 子句([列名] 为空)与 DISTINCT 冲突。” 通过删除 DISTINCT 关键字,查询执行 运行,并按照此解决方案指示进行排序。