访问:在查询条件中使用布尔函数的数据类型不匹配
Posted
技术标签:
【中文标题】访问:在查询条件中使用布尔函数的数据类型不匹配【英文标题】:Access: Data Type Mismatch using boolean function in query criteria 【发布时间】:2010-06-16 01:24:40 【问题描述】:我有一个返回布尔值的 VBA 函数 IsValidEmail()
。我有一个调用此函数的查询:Expr1: IsValidEmail([E-Mail])
。当我运行查询时,它显示 -1 表示 True,0 表示 False。到目前为止一切顺利。
现在我想过滤查询以仅显示无效电子邮件。我正在使用查询设计器,所以我只需将 0
的值添加到 Criteria 字段。这给了我一个“数据类型不匹配”错误。 "0"
(带引号)和 False 也是如此。我应该如何为布尔函数指定条件?
【问题讨论】:
【参考方案1】:对于布尔列,“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;
但是,这似乎是一个很长的尝试,因为您已经告诉我们您之前没有标准的尝试运行没有错误。如果这不能确定问题,您会考虑通过电子邮件向我发送您的数据库的精简副本吗?如果您有兴趣,请告诉我,我会给您我的电子邮件地址。
【讨论】:
我将您的查询复制/粘贴到 SQL 视图中,更改了表名,然后执行。同样的错误。 我在模拟发送给您的示例时发现了这一点。谢谢!【参考方案2】:该错误是由于我的表中的某些记录的电子邮件为空而引起的。我的查询具有排除空电子邮件记录的 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"))
解决了这个问题。
【讨论】:
我打算建议您检查 IsValidEmail() 的定义,以便它肯定返回布尔值而不是变体。如果它被定义为 Public Function IsValidEmail(...) 它应该更改为 Public Function IsValidEmail(...) As Boolean。您还可以将其更改为对传递的电子邮件地址使用变体,以便它可以在内部处理 Null,而无需为传递给它的每一行调用 Nz()。这还可以添加一个可选参数,让您可以选择将 Null 电子邮件视为有效还是无效。 ...继续说下去,对我来说,Null 电子邮件不是无效的电子邮件地址,只是缺少一个,这不是一回事。但是您是否同意取决于您如何使用它。顺便说一句,解析电子邮件地址的有效性实际上是一个相当复杂的过程,即使它的文本格式正确,也并不意味着它实际上是一个有效地址,因为它不会被退回。 @Fenton:感谢您的反馈。我正在寻找一种通过函数(明确定义为布尔值)接受空值并在内部处理它们的方法。我将实施您的变体参数方法。而且我很清楚电子邮件地址验证的复杂性——关于这个问题已经有足够多的问题了,所以我不打算在这里讨论。以上是关于访问:在查询条件中使用布尔函数的数据类型不匹配的主要内容,如果未能解决你的问题,请参考以下文章