2011-09-03 3 views
6

W poniższym zapytaniu chcę dodać warunek AND wewnątrz CASE i zanim TO jest to możliwe?Sprawa, kiedy, ale z warunkiem AND wewnątrz i wtedy przed

na przykład kiedy „R” i table1.name = „Jones”, a następnie „bardzo wysokie”

SELECT table1.id, table1.name, 
    CASE table1.event 
    WHEN 'r' THEN 'very high' 
    WHEN 't' THEN 'very low' 
    ELSE (SELECT table2.risk FROM table2 WHERE table2.value <= table1.value 
      ORDER BY table2.value DESC LIMIT 1) 
    END AS risk 
FROM table1 
ORDER BY FIELD(table1.event, 'r', 'f', 't'), table1.value DESC 

Odpowiedz

20

można przepisać swoje oświadczenie tak, aby osiągnąć to, co chcesz

SELECT table1.id, table1.name, 
    CASE 
    WHEN table1.event = 'r' AND table1.name = 'jones' THEN 'very high' 
    WHEN table1.event = 't' AND table1.name = 'smith' THEN 'very low' 
    ELSE (SELECT table2.risk FROM table2 WHERE table2.value <= table1.value 
      ORDER BY table2.value DESC LIMIT 1) 
    END AS risk 
FROM table1 
ORDER BY FIELD(table1.event, 'r', 'f', 't'), table1.value DESC 

Zauważ, że musisz usunąć table1.event a po instrukcji CASE. documentation here

+0

+1, byłem edycji tego pomysłu na moją odpowiedź, kiedy pisał ten =) – jadarnel27

+1

@ jadarnel217 haha ​​dziękuję będę +1 odpowiedź też, ponieważ to jest to samo. –

4

Wszystko, co ma wartość logiczną (prawda lub fałsz) może przejść w stan o CASEWHEN komunikat. Więc można zastąpić 'r' z:

('r' AND table1.name='jones')

myśleć o tym więcej, może trzeba stracić table1.event po CASE

SELECT table1.id, table1.name, 
    CASE 
     WHEN (table1.event = 'r' AND table1.name='Jones') THEN 'very high' 
     WHEN table1.event = 't' THEN 'very low' 
     ELSE (SELECT table2.risk 
       FROM table2 
       WHERE table2.value <= table1.value 
       ORDER BY table2.value DESC LIMIT 1) 
    END AS risk 
FROM table1 
ORDER BY FIELD(table1.event, 'r', 'f', 't'), table1.value DESC 
3

Przełączanie case <column> when <value> then ... do case when <condition> then ...:

CASE 
WHEN table1.event = 'r' AND table1.active = 1 THEN 'very high' 
...