2017-06-28 43 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。 –