Nz和IIF的替代品(Is Null)

时间:2013-09-18 13:14:32

标签: c# sql vb.net ms-access ado.net

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

使用ADO.Net在VB.Net中使用自制报告应用程序(C#会没问题)。查询存储在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执行子查询两次(可能)。由于子查询相当复杂(主要查询也是如此),我想避免这种情况,至少为了便于阅读,如果不是性能的话。

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

4 个答案:

答案 0 :(得分:4)

抱歉,别无他法。最干净的方法是

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

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

答案 1 :(得分:1)

尝试使用?如下所示:

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

答案 2 :(得分:0)

尝试一下:

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 :(得分:0)

看看我的自定义函数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是空字符串。