Nz 和 IIF 的替代方案(为空)

Posted

技术标签:

【中文标题】Nz 和 IIF 的替代方案(为空)【英文标题】:Alternative to Nz and IIF(Is Null) 【发布时间】:2013-09-18 13:14:32 【问题描述】:

我在 Access 中有一个查询,其中一个字段包含一个子查询,该查询返回相关表中特定字段的总和。子查询的结果用于主查询中的进一步计算。

这在使用 ADO.Net 的 VB.Net(C# 很好)中的自制报告应用程序中使用。查询存储在 Access 中的表中,以便我们更正小错误或添加与数据相关的临时功能,而无需再次发布我们的应用程序。

问题是子查询可能没有返回结果(null)。此外,计算中使用的空值也将返回空值。因此,如果需要,我需要将空值替换为 0。我添加了NZ(subquery, 0),但是 ADO.Net 抛出了以下异常:

Undefined function 'NZ' in expression

我了解到在 ADO.Net 中无法使用 VBA 函数,因为它是 Access.Application 对象的一部分。

我也考虑过使用IIF(subquery Is Null, 0, subquery),但这会迫使我复制子查询,并强制 Access 执行两次子查询(可能)。由于子查询相当复杂(主查询也是如此),我想避免这种情况,至少是为了可读性,如果不是性能的话。

是否有另一种方法可以将空值替换为另一个值,或者确保我的子查询即使没有匹配记录也将始终返回非空和?

【问题讨论】:

更改子查询 SQL,使其返回 0 而不是 Null。 【参考方案1】:

抱歉,没有其他办法。最干净的方法是

Iif(IsNull([Data]), 0, [Data])

NZ 是 Access 代码库特有的功能,因此您将无法使用它。

【讨论】:

我最终为我的子查询提供了自己的字段,并在计算中将该字段用作IIF(field Is Null, 0, field)【参考方案2】:

试试这个:

int? x = null;

// Set y to the value of x if x is NOT null; otherwise,
// if x == null, set y to -1.
int y = x ?? -1;

要了解更多信息,请参阅microsoft help

【讨论】:

【参考方案3】:

尝试使用 ??如下:

         double? nullableVar=null;
         double nonNullableVar;
         nonNullableVar = (nullableVar ?? 0);

【讨论】:

【参考方案4】:

看看我的自定义函数 ez:Undefined function 'Nz' in expression。这里是:

Public Function ez(ByVal vVal1 As Variant, Optional ByVal vVal2 As Variant = 0) As Variant
    If VBA.IsNull(vVal1) Or VBA.Len(vVal1) = 0 Then
        ez = vVal2
    Else
        ez = vVal1
    End If
End Function

正如你所看到的,它比原始函数更进一步,因为它不仅考虑第二个值是否第一个为空,而且如果它为空

此外,默认返回值为 0,而 Nz 为空字符串。

【讨论】:

以上是关于Nz 和 IIF 的替代方案(为空)的主要内容,如果未能解决你的问题,请参考以下文章

当值为空时获取计数

访问sql中的IIF和Nz运算符[关闭]

“JDA 成员可能不为空”错误的替代解决方案

rdlc报表如何判断字段是不是为空

在乘法表达式中字段为空时发生错误

如何让Access 空文本框参与计算时默认是0,如图碳粉为空,计算时自动变0,别用VB代码,VB我会,请用VBA