简化案例陈述

时间:2014-01-22 03:28:31

标签: sql case

以下是我使用CASE的当前更新声明。

UPDATE A
SET OAP.GradeRange = 
        CASE WHEN (ABS(CAST(A.GRADE_FROM AS INT) - CAST(A.GRADE AS INT))) > 1 THEN 'Y'  
        ELSE 'N' END  
FROM   dbo.Table A

如何在下面的CASE添加额外的过滤器?

where (grade_from <> 13 and GRADE <> 15)
OR (grade_from <> 15 and GRADE <> 13)

我正在尝试这种方式:

 UPDATE A
    SET OAP.GradeRange = 
            CASE WHEN (ABS(CAST(A.GRADE_FROM AS INT) - CAST(A.GRADE AS INT))) AND (grade_from <> 13 and GRADE <> 15) OR (grade_from <> 15 and GRADE <> 13) > 1 THEN 'Y'  
            ELSE 'N' END  
    FROM   dbo.Table A

如果有更好的方法可以提供建议。谢谢。

2 个答案:

答案 0 :(得分:2)

你的case缺少一组额外的括号,所以它没有做你想做的事情:

 UPDATE A
    SET OAP.GradeRange = 
            CASE WHEN (ABS(CAST(A.GRADE_FROM AS INT) - CAST(A.GRADE AS INT))) AND
                      ((grade_from <> 13 and GRADE <> 15) OR (grade_from <> 15 and GRADE <> 13) > 1)
                 THEN 'Y'  
                 ELSE 'N' END  
    FROM   dbo.Table A;

答案 1 :(得分:0)

试试这个。

我认为&gt; 1(大于1)应该在第一个条件之后到来。

UPDATE A
    SET OAP.GradeRange = 
            CASE WHEN (ABS(CAST(A.GRADE_FROM AS INT) - CAST(A.GRADE AS INT)) > 1) AND ((grade_from NOT IN ('13','15')) OR (GRADE NOT IN ('13','15')))  THEN 'Y'  
            ELSE 'N' END  
    FROM   dbo.Table A