2010-04-15 7 views
3

Странный проблема.MySQL Query WHERE Включая CASE или IF?

Мой запрос выглядит

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 

Apperantly MySQL возвращает неправильную сверку, и я думаю, что моя проблема в логике утверждения WHERE ... CASE. Может быть, с помощью скобок? Может быть, я должен пойти за оператором OR, а не AND? Должен ли мой второй WHEN включить скобки, даже когда я сравниваю только одно поле? Должен ли я использовать IF, а не CASE?

В основном я хочу, чтобы исключить некоторые строки с конкретными значениями, если Theres определенного значения в поле foo или bar

Я хотел бы попробовать, что все, но это занимает огромное количество времени, чтобы выполнить этот запрос ... :(

Edit: Просто для заметок, моя проблема была, что я забыл ELSE в моем 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 

Это решение также работает, но отвечал один б. Etter ...

+0

Это один не то же самое, используя раствор. ELSE TRUE -> OR (t1.field не в ('foo', 'bar')) – newtover

+0

Да, я знаю. Я забыл упомянуть, что 't1'.'field' может быть пустой строкой (в этом случае строка не должна возвращаться) или какой-либо другой строкой, кроме« foo »или« bar »(в этом случае строка * должна * (+ некоторое другое поле должно быть изменено, его сложный qry)). Поэтому я изменил ваше решение, чтобы оно соответствовало моим потребностям. – handfix

ответ

6

Вы должны использовать OR здесь вместо СЛУЧАЙ:

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) 
+0

О, боже, ваше право, им такой душечек. Ха-ха. Я явно переоценил это, я был уверен, что он просто не может быть таким простым, и поэтому даже не думал об этом решении. Возможно, это случается, когда вы пишете запрос с длинной страницей. – handfix