为啥在两个类型转换字段上连接的 Access 查询中会出现“#Error”的结果?
Posted
技术标签:
【中文标题】为啥在两个类型转换字段上连接的 Access 查询中会出现“#Error”的结果?【英文标题】:Why is there a result of `#Error` in an Access query with a join on two type-converted fields?为什么在两个类型转换字段上连接的 Access 查询中会出现“#Error”的结果? 【发布时间】:2018-01-08 20:26:08 【问题描述】:我在 Access 2010 查询中得到了 #Error
的结果,该查询在两个类型转换的字段上具有右连接。我可以通过改进查询来消除错误,但我对它发生的原因感到困惑。
我有以下两个表,T1 和 T2。两者都包含一个 ID 字段和一个文本字段。
T1 T2
ID | F1 ID | F1
----+----- ----+-----
1 | zzz 1 | aaa
2 | bbb 2 | bbb
3 | ccc 3 | NULL
然后我有两个简单的查询如下。 (是的,我知道他们并没有真正做任何有成效的事情。为了示例,我正在简化。)
Q1
SELECT [T1].[ID], CStr([T1].[F1]) AS SF1
FROM T1;
Q2
SELECT [T2].[ID], CStr([T2].[F1]) AS SF1
FROM T2;
这些查询的结果集和我预期的一样。
Q1 Q2
ID | SF1 ID | SF1
----+----- ----+-----
1 | zzz 1 | aaa
2 | bbb 2 | bbb
3 | ccc 3 | #Error
然后我有一个额外的查询,这是我遇到困惑的地方。
Q3
SELECT [Q1].[ID], [Q1].[SF1], [Q2].[SF1]
FROM Q1 RIGHT JOIN Q2 ON
[Q1].[SF1] = [Q2].[SF1];
第三次查询的结果不是我预期的。
Q3 (Actual)
Q1.ID | Q1.SF1 | Q2.SF1
-------+--------+-------
NULL | #Error | aaa
2 | bbb | bbb
Q3 (Expected)
Q1.ID | Q1.SF1 | Q2.SF1
-------+--------+-------
NULL | NULL | aaa
2 | bbb | bbb
3 | ccc | NULL
如果我将 CStr 函数替换为“非类型转换”函数,例如 Mid,结果与我预期的一样。
【问题讨论】:
【参考方案1】:问题其实很简单。与 Ctznkane 所说的不同,CStr(Null)
不会返回 Null
,因为在 VBA 中字符串不能是 Null
。相反,它会抛出 运行时错误 92:无效使用 Null。这就是你得到 #Error
有多种方法可以处理此问题。最明显的一种是使用Nz
函数(例如Cstr(Nz([T2].[F1]))
)。这会将Null
替换为空字符串。但是,空字符串不为空,因此IsNull(Cstr(Nz(Null)))
将返回 false。
正确的做法实际上是单独处理Null
,因为字符串不能是Null
:
IIF([T2].[F1] Is Not Null, CStr([T2].[F1]), Null)
【讨论】:
我应该澄清我在查询设计器中使用 SQL 视图。我不在 VBA 中这样做。而且我知道 CStr(Null) 不会返回 Null。我对第三季度结果第一行中的#Error 结果感到困惑。 我理解,但是CStr本质上是一个VBA函数,因此有这些限制。您在与 Null 形成对比的字段上使用 CStr,这就是您得到 #Error 的原因以上是关于为啥在两个类型转换字段上连接的 Access 查询中会出现“#Error”的结果?的主要内容,如果未能解决你的问题,请参考以下文章
为啥是 ”。” Access中的查询字段名称中允许但表字段名称中不允许?