为什么在两个经过类型转换的字段中使用连接的Access查询中存在“#Error”的结果?

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了为什么在两个经过类型转换的字段中使用连接的Access查询中存在“#Error”的结果?相关的知识,希望对你有一定的参考价值。

我得到了#Errorin Access 2010查询的结果,该查询在两个类型转换的字段上有正确的连接。我可以通过改进查询来消除错误,但我很困惑为什么会发生这种错误。

我有以下两个表,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,结果就像我期望的那样。

答案

问题很简单。与Ctznkane所说的不同,CStr(Null)不会返回Null,因为VBA中的字符串不能是Null。相反,它会抛出运行时错误92:无效使用Null。这就是你得到#Error的原因

有多种方法可以解决这个问题。最明显的一个是使用Nz函数(例如Cstr(Nz([T2].[F1])))。这用空字符串替换Null。但是,空字符串不为null,因此IsNull(Cstr(Nz(Null)))将返回false。

正确的做法是分别处理Null,因为字符串不能是NullIIF([T2].[F1] Is Not Null, CStr([T2].[F1]), Null)

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

oracle 数据库code 拼接字段如何转换成文字

无法在 Snowflake 中使用混合数据类型的字段内连接两个简单的 CTE

postman设置环境变量,字段值经过json转换后数值超过类型上限的解决方法

从两个表中,把不同类型的字段查询连接在一起

sqlserver中如何把字符串转换成数字

js转换数据库中DateTime字段类型