2011-09-03 75 views
6

在下面的查詢中,我想添加一個AND條件內CASE的WHEN和THEN之前是可能的嗎?當時的情況,但與時間和之前內部的AND情況

例如當「r」和table1.name =「瓊斯」 THEN「很高」

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 

回答

20

你可以重寫你這樣的語句來完成你想要

什麼
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 

注意,您需要刪除table1.event a發送至CASE聲明。 documentation here

+0

+1,我在編這個想法進入我的答案,當你發佈此=) – jadarnel27

+1

@ jadarnel217哈哈,謝謝,我會+1你的答案也一樣,因爲它是一樣的。 –

4

任何計算結果爲布爾型(真或假)可以在CASEWHEN條件去聲明。所以,你可以替換'r'有:

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

更多這方面的思考,你可能會失去後table1.eventCASE

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

開關從case <column> when <value> then ...case when <condition> then ...

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