我有一个返回布尔值的VBA函数IsValidEmail()
。我有一个调用此函数的查询:Expr1: IsValidEmail([E-Mail])
。当我运行查询时,它显示-1表示True,0表示False。到目前为止一切都很好。
现在我想过滤查询以仅显示无效的电子邮件。我正在使用查询设计器,因此我只需将0
的值添加到Criteria字段。这给了我“数据类型不匹配”错误。 "0"
(带引号)和False也是如此。我该如何指定布尔函数的标准?
答案 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"))
解决了这个问题。