2016-02-29 97 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