2014-01-22 63 views
0

下面是一个使用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 

如果有什么更好的方式来写,请指教。谢谢。

+1

如果你希望它能够正常工作,你可能需要在你的或/和条件内部的括号内(在演员之后) – Bohemian

回答

0

试试这个。

我认为> 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 
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;