2016-07-26 93 views
1

我有以下SQL語句:與Access查詢SQL IIF語句或

SELECT * FROM BOM INNER JOIN Parts ON BOM.PartID = Parts.PartID 
WHERE (((BOM.PUMP_CODE) Like (IIf([Forms]![frmSelector]![tbMotor]>0 And 
    [Forms]![frmSelector]![tbShaft]>0,"MOTOR" Or "SHAFT",IIf([Forms]![frmSelector]![tbMotor]>0,"MOTOR","SHAFT"))))) 
ORDER BY BOM.BOM_INDEX; 

在第一個IIF語句,我不能讓查詢返回任何記錄。當兩個引用對象都> 0時,我希望它在PUMP_CODE字段中返回帶有「MOTOR」或「SHAFT」的所有記錄。即使兩個對象都大於0,它仍然不會返回任何記錄。然而,後者的國際投資框架聲明工作得很好。這個查詢有問題嗎?

+0

在第一個IIF語句你真正表達的項目,「MOTOR」或者「SHAFT」無效。您只需要第一個IIF的真實部分,因爲這是第二個IIF表達式的一部分。 –

回答

1

您的"MOTOR" Or "SHAFT"是錯誤的。兩個字符串的or被評估爲FIRST,並且or的結果是iif()所使用的結果。

這意味着你切實做好

IIF(..., true, ...) 

或者什麼,那就是接入or兩大串入。

在任何幾乎任何編程語言,你不能這樣做

if (x == "a" or "b") 

,因爲它會爲

if (x == ("a" or "b")) -> if (x == (result)) 

你需要做的

if (x == "a") OR (x == "b") 
+0

我明白你對編程理論的看法,但我不確定如何解決它。我嘗試使用括號如下: 'Like(IIf([Forms]![frmSelector]![tbMotor]> 0並且[Forms]![frmSelector]![tbShaft]> 0,(([BOM]。[PUMP_CODE ])=「MOTOR」)或(([BOM]。[PUMP_CODE])=「SHAFT」),IIf([Forms]![frmSelector]![tbMotor]> 0,「MOTOR」,「SHAFT」 」。結果是一樣的, – jhalf2008

+0

再次不起作用。你仍然在裏面做一個'或',這意味着'或'的結果是返回的。 'iif(condition,truevalue,falsevalue)'。你需要在'condition'部分進行測試。在truevalue/falsevalue部分中做它返回您或'比較的結果,而不是值本身。例如'IIF(tbmotor> 0或pump_code ='motor'或pump_code ='shaft',something,whatever)' –

+0

好的,我明白那個部分。雖然我並沒有嘗試在iif(...,true ....)中進行任何測試。測試已經由iff(測試,...,...)下的兩個「> 0」檢查完成。因爲這兩個標準都已通過,我希望查詢在PUMP_CODE字段中使用「SHAFT」返回記錄,並且還要在字段PUMP_CODE中使用「MOTOR」記錄。是否有另一種方法來構建查詢來完成此操作? – jhalf2008

0

嘗試使用執行IN子句而不是LIKE,如果兩個設置都大於0,則更改您的IIF以將它們放在一起,否則請使用您的工作條款。

我還添加了逃脫雙引號括一對,並加入到單品的情況下,你曾經使用在他們的空間

SELECT * FROM BOM INNER JOIN Parts ON BOM.PartID = Parts.PartID 
WHERE BOM.PUMP_CODE IN (
IIf([Forms]![frmSelector]![tbMotor]>0 And [Forms]![frmSelector]![tbShaft]>0, """MOTOR"",""SHAFT""", 
    IIf([Forms]![frmSelector]![tbMotor]>0,""MOTOR"",""SHAFT"")))  
ORDER BY BOM.BOM_INDEX;