MS Access 2007 中 NVL 功能的替代方法是啥
Posted
技术标签:
【中文标题】MS Access 2007 中 NVL 功能的替代方法是啥【英文标题】:what is the alternative to NVL function in MS Access 2007MS Access 2007 中 NVL 功能的替代方法是什么 【发布时间】:2013-05-30 05:05:06 【问题描述】:我在 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 而不是零。
【问题讨论】:
【参考方案1】: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 自身内部运行的查询。例如,如果您尝试从 Access 外部运行使用 Nz()
的存储查询(例如,如果您尝试将查询中的数据导入 Excel),则该查询将不起作用。在这两种情况下都可以使用的等效(但更详细)构造是 IIf(IsNull(<expression>),<value if null>,<expression>)
。
你能给出NZ的语法吗
我尝试了 NZ(expression,0) 但它不起作用,我得到一个空字段作为输出以上是关于MS Access 2007 中 NVL 功能的替代方法是啥的主要内容,如果未能解决你的问题,请参考以下文章
ms-access 2007 运行时和 lockWindowUpdate
我需要结合 MS Access 和 MS Outlooks 数据收集功能创建自定义(邮件合并)电子邮件