3 Stimmen

MySQL-Abfrage WHERE einschließlich CASE oder IF?

Seltsames Problem.

Meine Abfrage sieht wie folgt aus

SELECT DISTINCT ID, `etcetc`, `if/elses over muliple joined tables` FROM
    table1 AS `t1`
    # some joins, eventually unrelated in that context
WHERE
# some standard where statements, they work/

CASE 
    WHEN `t1`.`field` = "foo" THEN (`t1`.`anOtherField` != 123 AND `t1`.`anOtherField` != 456 AND `t1`.`anOtherOtherField` != "some String")
    WHEN `t1`.`field` = "bar" THEN `t1`.`aSecondOtherField` != 12345
    END

#ORDER BY CASE etc. Standard Stuff

Offenbar gibt MySQL eine falsche Zeilenzahl zurück, und ich denke, mein Problem liegt in der Logik der WHERE ... CASE-Anweisung. Vielleicht mit den Klammern? Vielleicht sollte ich mich für den Operator OR und nicht AND ? Sollte meine zweite WHEN auch Klammern einschließen, auch wenn ich nur ein Feld vergleiche? Sollte ich verwenden IF und nicht CASE ?

Grundsätzlich möchte ich einige Zeilen mit bestimmten Werten ausschließen, wenn es einen bestimmten Wert im Feld foo o bar

Ich würde das alles ausprobieren, aber es dauert sehr lange, bis die Abfrage abgeschlossen ist... :(

Edit: Nur für die Notizen, mein Problem war, dass ich die ELSE in meinem CASE .

CASE 
    WHEN `t1`.`field` = "foo" THEN (`t1`.`anOtherField` != 123 AND `t1`.`anOtherField` != 456 AND `t1`.`anOtherOtherField` != "some String")
    WHEN `t1`.`field` = "bar" THEN (`t1`.`aSecondOtherField` != 12345)
    ELSE TRUE
END

Diese Lösung funktioniert auch, aber die gepostete Lösung ist besser...

6voto

newtover Punkte 29616

Sie sollten hier OR anstelle von CASE verwenden:

WHERE
(`t1`.`field` = "foo" AND `t1`.`anOtherField` != 123 AND `t1`.`anOtherField` != 456 AND `t1`.`anOtherOtherField` != "some String")
OR
(`t1`.`field` = "bar" AND `t1`.`aSecondOtherField` != 12345)

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X