访问:数据类型在查询条件中使用布尔函数不匹配

时间:2010-06-16 01:24:41

标签: ms-access ms-access-2007 access-vba

我有一个返回布尔值的VBA函数IsValidEmail()。我有一个调用此函数的查询:Expr1: IsValidEmail([E-Mail])。当我运行查询时,它显示-1表示True,0表示False。到目前为止一切都很好。

现在我想过滤查询以仅显示无效的电子邮件。我正在使用查询设计器,因此我只需将0的值添加到Criteria字段。这给了我“数据类型不匹配”错误。 "0"(带引号)和False也是如此。我该如何指定布尔函数的标准?

2 个答案:

答案 0 :(得分:2)

对于布尔列,“0”肯定会为您提供“条件表达式中的数据类型不匹配”错误。但是,没有引号的0或False应该有效。我不明白他们为什么会产生同样的错误。

通过直接编辑SQL,查看是否可以生成有效的查询。创建一个新查询,切换到SQL视图并粘贴到此语句中(将YourTableName替换为表的名称)。

SELECT IsValidEmail([E-Mail]) AS valid_email
FROM YourTableName
WHERE IsValidEmail([E-Mail]) = False;

当您以这种方式创建查询时,您的查询是否会正常运行?

更新:由于该查询也产生了同样的错误,我所能建议的只是尝试没有任何标准。

SELECT
    IsValidEmail([E-Mail]) AS valid_email,
    TypeName(IsValidEmail([E-Mail])) AS type_of_valid_email
FROM YourTableName;

然而,这似乎是一个很长的镜头,因为你已经告诉我们你没有标准的早期尝试运行没有错误。如果这不能识别问题,您会考虑通过电子邮件向我发送数据库的精简副本吗?如果您有兴趣,请告诉我,我会告诉您我的电子邮件地址。

答案 1 :(得分:1)

错误是由于我的表中的某些记录具有空电子邮件。我的查询有一个where条件来排除空电子邮件记录,所以当我在IsValidEmail列上没有条件运行它时,我的函数只被调用具有非空电子邮件的记录。但是,当我在IsValidEmail上添加条件时,它为每条记录调用了函数,并且错误来自于尝试将null传递给期望字符串的函数。

另一种说法:

SELECT [E-Mail],
       IsValidEmail([E-Mail]) <--Executed only for rows matching where clause
FROM   Contacts
WHERE  IsValidEmail([E-Mail]) = False; <-- Gets executed for all rows

将我的查询表达式从IsValidEmail([E-Mail])更改为IsValidEmail(nz([E-Mail],"X"))解决了这个问题。