2016-07-26 9 views
1

ich die folgenden SQL-Anweisung habe:Access Query SQL Anweisung von IIF mit OR

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; 

In der ersten Anweisung von IIF, kann ich die Abfrage keine Datensätze zurück. Ich möchte, dass alle Datensätze mit "MOTOR" oder "SHAFT" im Feld PUMP_CODE zurückgegeben werden, wenn beide referenzierten Objekte> 0 sind. Obwohl beide Objekte größer als 0 sind, werden immer noch keine Datensätze zurückgegeben. Die letzte IIF-Anweisung funktioniert jedoch gut. Gibt es ein Problem mit dieser Abfrage?

+0

In der ersten Anweisung von IIF Ihren wahren Ausdruck, „MOTOR“ Or "SHAFT" ist nicht gültig. Sie brauchen hier nur den wahren Teil des ursprünglichen IIF, da das Falsche Teil des zweiten IIF-Ausdrucks ist. –

Antwort

1

Ihre "MOTOR" Or "SHAFT" ist falsch. Die or von zwei Strings wird zuerst ausgewertet, und das Ergebnis dieser or ist, was von iif() verwendet wird.

Das bedeutet, sind Sie effektiv tun

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

oder was auch immer es ist, dass der Zugang or s zwei Strings in.

In jedem so ziemlich jeder Programmiersprache, können Sie nicht

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

tun, weil es so ausgeführt werden, werden

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

Sie benötigen

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

Ich verstehe, was Sie über die Programmierungstheorie sagen, aber ich bin mir nicht sicher, wie ich es lösen kann. Ich habe versucht, Klammern wie folgt zu verwenden: 'Wie (IIf ([Formulare]! [FrmSelector]! [TbMotor]> 0 Und [Formulare]! [FrmSelector]! [TbShaft]> 0, (([BOM]. [PUMP_CODE ]) = "MOTOR") Oder (([BOM]. [PUMP_CODE]) = "SHAFT"), IIf ([Formulare]! [FrmSelector]! [TbMotor]> 0, "MOTOR", "SHAFT"))) ". Das Ergebnis ist das gleiche, – jhalf2008

+0

wieder das wird nicht funktionieren. Du machst immer noch ein "oder" drinnen, was bedeutet, dass das ERGEBNIS des 'oder' zurückgegeben wird. 'iif (Bedingung, wahrer Wert, falscher Wert)'. Sie müssen Ihre Tests im Abschnitt "Bedingung" durchführen. tue es in den wahr/falsch-Wert-Abschnitten RETURNS die Ergebnisse Ihrer 'oder' Vergleich, nicht die Werte selbst. z.B. 'iif (tbmotor> 0 ODER pump_code = 'motor' ODER pump_code = 'welle', irgendwas, was auch immer)' –

+0

OK, ich verstehe diesen Teil. Ich habe nicht versucht, irgendwelche Tests in der iif (..., wahr ....) obwohl. Der Test wird bereits durch die beiden "> 0" Checks unter iff (testing, ..., ...) durchgeführt. Da diese beiden Kriterien bestanden haben, möchte ich, dass die Abfrage Datensätze mit "SHAFT" im Feld PUMP_CODE zurückgibt und auch mit "MOTOR" im Feld PUMP_CODE aufzeichnet. Gibt es eine andere Möglichkeit, die Abfrage zu strukturieren, um dies zu erreichen? – jhalf2008

0

Versuchen zu tun, die mit IN-Klausel anstelle von LIKE und ändern Sie Ihre IIF, um beide zusammen zu setzen, wenn beide Einstellungen größer als 0 sind, andernfalls verwenden Sie Ihre Arbeitsklausel

Ich habe auch doppelte Anführungszeichen entkam das Paar zu umschließen, und hinzugefügt, um einzelne Artikel im Fall, dass Sie jemals Elemente verwenden, die Leerzeichen in ihnen

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;