为啥在两个类型转换字段上连接的 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,因为字符串不能是NullIIF([T2].[F1] Is Not Null, CStr([T2].[F1]), Null)

【讨论】:

我应该澄清我在查询设计器中使用 SQL 视图。我不在 VBA 中这样做。而且我知道 CStr(Null) 不会返回 Null。我对第三季度结果第一行中的#Error 结果感到困惑。 我理解,但是CStr本质上是一个VBA函数,因此有这些限制。您在与 Null 形成对比的字段上使用 CStr,这就是您得到 #Error 的原因

以上是关于为啥在两个类型转换字段上连接的 Access 查询中会出现“#Error”的结果?的主要内容,如果未能解决你的问题,请参考以下文章

为啥是 ”。” Access中的查询字段名称中允许但表字段名称中不允许?

为啥我不能在 Access 参数查询中使用字段名称作为参数?

如何对access中两个数据库中表进行联合查询

如何连接两张表,用access?

access怎么在查询中把来自两个表的值加在一起?

“时间”字段上的 Access 2016 类型转换错误