新西兰和 IIF 的替代品(为空)

本文关键字:为空 替代品 IIF 新西兰 | 更新日期: 2023-09-27 18:31:43

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

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

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

Undefined function 'NZ' in expression

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

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

有没有其他方法可以用另一个值替换 null 值,或者确保我的子查询始终返回非 null 总和,即使没有匹配的记录?

新西兰和 IIF 的替代品(为空)

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

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

NZ 是特定于 Access 代码库的函数,因此您将无法使用它。

试试这个:

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;

若要了解详细信息,请参阅微软帮助

尝试使用 ?? 如下所示:

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

看看我的自定义函数 ez:表达式中的未定义函数 'Nz'。在这里:

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

如您所见,它比原始函数更进一步,因为它不仅考虑第一个值为 null 的第二个值,而且还考虑它是否为空的值

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