MS Access 2007中替代NVL函数的是什么?

10

我在MS Access中编写了一条SQL查询

select NVL(count(re.rule_status),0) from validation_result re, validation_rules ru where re.cycle_nbr="+cycle_nbr+" and re.rule_response=ru.rule_desc and re.rule_status='FAIL' and ru.rule_category='NAMING_CONVENTION' group by re.rule_status"

但是输出为 Null。我想将其转换为 Zero。如果使用 NVL 函数,则 MS Access 不接受它。我也尝试了 NZ 函数,但它也会给出相同的输出,即 NULL 而不是 Zero。

1个回答

13

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

2
请注意,Nz() 仅限于在 Access 中运行的查询。例如,使用 Nz() 的存储查询如果您尝试从 Access 外部运行它(例如,如果您尝试将查询中的数据导入 Excel),则无法正常工作。在两种情况下都可以正常工作的等效(但更冗长)结构是 IIf(IsNull(<expression>),<value if null>,<expression>) - Brian Camire
能否提供 NZ 的语法? - user2435056
我尝试了NZ(expression,0),但它没有起作用,输出为空字段。 - user2435056

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