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

Ms access 访问:查询条件中使用布尔函数的数据类型不匹配,ms-access,ms-access-2007,vba,Ms Access,Ms Access 2007,Vba,我有一个VBA函数,它返回一个布尔值。我有一个调用此函数的查询:Expr1:IsValidEmail([E-Mail])。当我运行查询时,它显示-1表示True,0表示False。到目前为止还不错 现在我想过滤查询,只显示无效的电子邮件。我使用的是查询设计器,所以我只需在条件字段中添加一个值0。这给了我一个“数据类型不匹配”错误。“0”(带引号)和False也是如此。如何为布尔函数指定条件?对于布尔列,“0”肯定会导致“条件表达式中的数据类型不匹配”错误。但是,不带引号的0或False应该可以工

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

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

对于布尔列,“0”肯定会导致“条件表达式中的数据类型不匹配”错误。但是,不带引号的0或False应该可以工作。我不明白他们为什么会产生同样的错误

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

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

更新:由于该查询也产生了相同的错误,因此我只能建议在没有任何条件的情况下尝试此查询

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

然而,这似乎是一个远大的希望,因为您已经告诉我们您之前的尝试没有任何标准,但没有错误。如果这不能确定问题,你能考虑给我一个数据库的精简副本吗?如果您感兴趣,请告诉我,我会告诉您我的电子邮件地址。

此错误是由于我表中的某些记录包含空电子邮件造成的。我的查询有一个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])我将您的查询复制/粘贴到SQL视图中,更改表名,然后执行。同样的错误。我是在模拟一个示例发送给你时发现的。谢谢我想建议您检查IsValidEmail()的定义,这样它肯定会返回布尔值而不是变量。如果它被定义为公共函数IsValidEmail(…),则应将其更改为布尔形式的公共函数IsValidEmail(…)。您还可以将其更改为对传递的电子邮件地址使用一个变量,这样它就可以在内部处理空值,而无需为传递给它的每一行调用Nz()。这还可以添加一个可选参数,让您可以选择将空电子邮件计算为有效或无效…从这一点继续,对我来说,空电子邮件不是无效的电子邮件地址,只是缺少一个,这不是一回事。但你是否同意取决于你如何使用它。顺便说一句,解析电子邮件地址的有效性实际上是一个相当复杂的过程,即使它的文本格式正确,也不意味着它实际上是一个有效的地址,因为它不会反弹。@Fenton:谢谢你的反馈。我一直在寻找一种让by函数(显式定义为boolean btw)接受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