为什么在两个经过类型转换的字段中使用连接的Access查询中存在“#Error”的结果?
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了为什么在两个经过类型转换的字段中使用连接的Access查询中存在“#Error”的结果?相关的知识,希望对你有一定的参考价值。
我得到了#Error
in 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
,因为字符串不能是Null
:IIF([T2].[F1] Is Not Null, CStr([T2].[F1]), Null)
以上是关于为什么在两个经过类型转换的字段中使用连接的Access查询中存在“#Error”的结果?的主要内容,如果未能解决你的问题,请参考以下文章
无法在 Snowflake 中使用混合数据类型的字段内连接两个简单的 CTE