2017-06-28 41 views
0

我有以下问题:where语句中null的使用无效;没有NULL值

我使用两个查询解析导入的数据,它们都选择数据 导入的数据集是相当复杂的,但这种再现错误。

QueryA:

SELECT CDbl(FieldA) As DblA, Imported.* From Imported WHERE FieldA IS NOT NULL 

QueryB:

SELECT * FROM QueryA WHERE DblA > 7 AND DblA < 600 

QueryA运行正常,QueryB如果我插入来自QueryA结果表中并运行抛出无效使用空的错误

的QueryB反对,我没有收到错误,但是,这是不希望的。

如果我从QueryB中删除WHERE,它运行良好。

对此有没有不同的解决方法?或者我应该只接受多余的表格?

+0

'NZ'会解决吗? 'SELECT * FROM QueryA WHERE NZ(DblA,0)> 7 AND NZ(DblA,0)<600'。任何空值被替换为0. –

+0

@ DarrenBartrup-Cook'NZ'不能解决它。该列中没有空值。 –

+1

我建议先从QueryA中删除'Imported。*',然后明确开始将字段添加回QueryA。您可能会在数据集中发现ms-access存在问题的字段。 – manotheshark

回答

0

啊,修好了,还是不知道为什么。

改变QueryA

SELECT CDbl(Nz(FieldA, 999)) As DblA, Imported.* From Imported WHERE FieldA IS NOT NULL AND Nz(FieldA, 999) <> 999 

至于我的SQL知识去这不应该有任何区别,但它确实。如果有人能解释它,我会欢迎它。

999而不是0是因为否则我会在其他函数(除真正的Access应该没有运行任何功能,因为它被过滤掉)除以除错。

+1

我认为查询优化是问题所在。我的猜测是,它试图在'FieldA不为空'之前评估'DblA> 7 AND DblA <600'部分,它不会将它们作为单独的查询运行。当从一个返回大量数据的查询中进行选择时,这会提高速度,但当它不按预期的顺序运行查询时,也会出现这些奇怪的错误。 – Quark

+0

@夸克说得通,感谢解释。我一直认为优化器做奇怪的事情是MS SQL的事情,并且Access只是按顺序处理了事情,但我想我错了。在一门课程中,我甚至知道我应该使用子查询而不是引用其他查询,否则优化器将无法工作。 –

+0

它对我来说是有道理的,它是如何做的,但我没有关于它的文档。否则,我会发布它作为答案:) – Quark

0

试试这个查询。

SELECT * FROM QueryA WHERE DblA > 7 AND DblA < 600 AND Dbla IS NOT NULL 
+0

没有,仍然无效使用null –

+0

为什么我们不应用查询A中的范围条件? SELECT CDbl(FieldA)As DblA,Imported。* from Imported WHERE FieldA is NOT NULL and FieldA> 7 AND FieldA <600。 –

+0

有多个查询依赖于QueryA,而QueryA实际上是使用IIF语句,从三个字段中的一个获取DblA。 –