如何对末尾为 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 关键字,查询执行 运行,并按照此解决方案指示进行排序。
我正在使用个人数据库来跟踪我的项目。
我在 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 关键字,查询执行 运行,并按照此解决方案指示进行排序。