2016-02-29 101 views
0

我做了以下情況時聲明我的SQL:情況下,當MySQL與多個條件

SELECT 
*, 
CASE 
    WHEN lead_time < 14 THEN 0 
    WHEN (14 <= lead_time < 21 AND days_passed = 8) THEN 1 
    WHEN 
     (21 <= lead_time < 28 
      AND days_passed = 15) 
    THEN 
     1 
    WHEN 
     (28 <= lead_time < 42 
      AND days_passed = 22) 
    THEN 
     1 
    WHEN 
     (42 <= lead_time < 56 
      AND days_passed = 36) 
    THEN 
     1 
    WHEN 
     (56 <= lead_time < 84 
      AND days_passed = 29) 
    THEN 
     1 
    WHEN 
     (56 <= lead_time < 84 
      AND days_passed = 50) 
    THEN 
     1 
    WHEN (lead_time > 84 AND days_passed = 36) THEN 1 
    WHEN (lead_time > 84 AND days_passed = 57) THEN 1 
    ELSE 0 
END AS send_email 

我沒有得到任何錯誤。然而,當我檢查結果我得到:

# lead_time, days_passed, send_email 
99, 15, 1 
99, 22, 1 
99, 15, 1 
99, 8, 1 
99, 8, 1 
99, 8, 1 
99, 8, 1 
85, 29, 1 
57, 50, 1 
18, 36, 1 
99, 22, 1 
99, 22, 1 
99, 22, 1 
99, 22, 1 
99, 22, 1 
15, 15, 1 
15, 15, 1 
99, 8, 1 
99, 8, 1 
99, 8, 1 
99, 8, 1 

它看來,如果「和」在查詢表現爲一個「或」。任何想法爲什麼? 謝謝,

+1

你介意告訴我們這個非常複雜的'CASE'語句背後的邏輯是什麼? –

+2

我不是mysql的專家,但我從來沒有見過檢查值的簡寫是在兩個數字之間。我會使用Between運算符。出於興趣,你有沒有參考文檔的速記符號? –

+0

+1用於檢查邏輯。聲明看起來非常脆弱,特定於目前存在的數據並且通常沒有太多用處,如果它是一次性的,那麼它是可以的,但是明天會發生什麼,據推測days_passed可能是16而不是15等。 –

回答

2

比較14 <= lead_time < 21 AND days_passed = 8按順序檢查,所以在某種程度上你有:

((14 <= lead_time) < 21) AND (days_passed = 8) 

這始終是true因爲14 <= lead_time等於1,所以你的比較是等於:

(1 < 21) AND days_passed = 8 

對於每個比較,您應該使用betweenand