Nz()
函数一定是您要找的函数。您说您尝试使用它并返回了Null
,但我很难相信,因为Nz()
的整个意义在于不返回Null
。参考:
x = Nz(Null, 0)
返回0(VbVarType.vbInteger
)
x = Nz(Null, "")
返回一个空字符串(VbVarType.vbString
)
x = Nz(Null)
返回一个空变量(VbVarType.vbEmpty
,而不是VbVarType.vbNull
)
编辑
进一步调查显示,您特定情况下的问题在于您正在查询中进行了COUNT(re.rule_status)
,同时也执行了GROUP BY re.rule_status
。如果查询的WHERE
子句导致结果为空集(没有返回行),则总体查询只返回没有行的单个行而不是0或Null的值。
可以使用以下测试代码进行验证...
Sub NzTest()
Dim rst As DAO.Recordset, strSQL As String
strSQL = "SELECT Nz(COUNT(LastName), 0) FROM Members WHERE False GROUP BY LastName"
Debug.Print strSQL
Set rst = CurrentDb.OpenRecordset(strSQL, dbOpenSnapshot)
If rst.EOF Then
Debug.Print "No rows were returned."
Else
Debug.Print "Count = " & rst(0).Value
End If
rst.Close
Set rst = Nothing
End Sub
...产生结果的操作
SELECT Nz(COUNT(LastName), 0) FROM Members WHERE False GROUP BY LastName
No rows were returned.
当移除 GROUP BY
后,我们得到...
SELECT Nz(COUNT(LastName), 0) FROM Members WHERE False
Count = 0
事实上,在这种情况下甚至不需要Nz()
:
SELECT COUNT(LastName) FROM Members WHERE False
Count = 0
Nz()
仅限于在 Access 中运行的查询。例如,使用Nz()
的存储查询如果您尝试从 Access 外部运行它(例如,如果您尝试将查询中的数据导入 Excel),则无法正常工作。在两种情况下都可以正常工作的等效(但更冗长)结构是IIf(IsNull(<expression>),<value if null>,<expression>)
。 - Brian Camire