空值是Access和SQL服务器的开发人员所特有的问题。尽管通过链接表(linked table)或者ADP文件(Access的项目),Access经常被用作SQL服务器的前端,但是这两个系统并没有使用同一个函数来处理空值。是否知道使用正确的函数就意味着客户满意和客户抛弃你的区别。
在MDB数据库里查找空值的时候,Jet支持下列函数:
一旦你碰到了空值,就要使用Nz()函数、IIF()函数和VBA的If statement来处理它。IIF()这个函数对于查询和标准表达式很有用。要在模块里使用VBA的If statement,而Nz()函数能够用在任何地方。
假设你想要在Northwind雇员(Employees)表格里找到空(Null)的 Region值,你可以使用下面这两个表达式中的一个:
Reg: Nz([Region],"N/A")
Reg: IIf(IsNull([Region]),"N/A",[Region])
如果在地区(Region)字段里存在空值,那么这两个表达式就会返回一个无效(N/A)字符串,如图A所示。
图A
真的没有什么理由要使用IIF(),除非你想要在被检测的值本身非空时返回这个值之外,还想返回某些东西。例如你不希望返回地区的值,而想要返回华盛顿(Washington)的值。在这种情况下,Nz()函数就无法使用了,因此就要改用下面的IIF()函数:
IIF(IsNull([Region], "N/A", "Washington)
(要获得同样的结果,你就要在VBA模块里使用If statement。)
在用在VBA模块里的时候,你可能要在SQL WHERE子句里使用Is Null找到空值,或者在这些空值导致错误之前使用Nz()来发现它们。例如,通过只包括进地区值是空的记录,下面的过程会过滤掉雇员表单的recordset:
DoCmd.OpenForm "Employees",,, "Region
Is Null"
编写良好的代码不会忽略掉空值,而是会处理它们。例如,Listing A里的过程显示了每个雇员的地区值。如果不存在任何值的话,所给出的提示信息顶多就是令人不解的,如图B所示。图B左边的对话框显示的是当你没有处理地区字段里可能的空值时的过程;图B右边的对话框显示的是如果处理这些空值会带来的结果。如果地区的值不存在,那么Nz()函数就会返回N/A无可用字符串,而不会什么都不返回。
图B