案例陈述导致Where子句

时间:2013-06-12 21:35:30

标签: sql-server case

我有一个我需要使用的案例陈述结果。我想把它放在Where子句中,但由于CASE声明的复杂性,我遇到了一些困难。

这是我的CASE声明......结果是“已实现”或“未达成”。我需要在最终结果中“未达成”。

  CASE WHEN (ESF.ID IN   
  ('727','732','737','813','738','739','740','741','742','743') 
   AND b.ANSWER ='Checked') THEN 'Not Achieved'
     WHEN (ESF.ID IN 
      ('727','732','737','813','738','739','740','741','742','743')        
        AND Z.ANSWER ='Unchecked') THEN 'Achieved'
         ELSE ''
     End AS Results_c

2 个答案:

答案 0 :(得分:1)

如果要过滤select语句的结果,以便只有Results_c = case表达式的值的行,那么只需将它放在where子句的右侧

 Select [stuff]
 From tableName
 Where (ESF.ID IN 
         ('727','732','737','813','738','739','740','741','742','743') 
           And b.ANSWER ='Checked') Or  
       (ESF.ID IN 
         ('727','732','737','813','738','739','740','741','742','743')
           And Z.ANSWER ='Unchecked') 

在这种情况下,我注意到两个ID列表是相同的,所以你也可以写:

 Select [stuff]
 From tableName
 Where ESF.ID IN  ('727','732','737','813','738','739','740','741','742','743') 
     And (b.ANSWER = 'Checked' Or Z.ANSWER ='Unchecked') 

仅显示 Not Achieved,

的那些
 Select [stuff]
 From tableName
 Where ESF.ID IN  ('727','732','737','813','738','739','740','741','742','743')
           AND b.ANSWER ='Checked'   

答案 1 :(得分:0)

CASE语句以这种方式处理,一个规则从第一个开始计算。一旦规则得到满足(返回TRUE),就会对此规则进行操作,并检查此CASE状态中的规则是否结束。

所以重写你的CASE:

当ESF.Form_Dim_ID不在时的情况       (''727','732','737','813','738','739','740','741','742','743')那么''    当b.ANSWER ='Checked')那么'没有实现'    当Z.ANSWER ='未选中'时,那么'已实现'    ELSE''      结束AS Results_c

如果您只需要Not Achieved,那么

WHERE
[...]
AND (ESF.Form_Dim_ID NOT IN   
         ('727','732','737','813','738','739','740','741','742','743') 
    AND b.ANSWER ='Checked')
    )

然而,获得预期结果可能非常困难,因为此CASE语句中的每个下一次检查都使用不同的列,并且不能满足先前检查的其他组合。 E.g:

WHEN ESF.ID IN   ('727','732','737','813','738','739','740','741','742','743') 

如果ESF.ID不在此列表中该怎么办? (也为什么整数称为字符串?)

`b.ANSWER ='Checked`  and `Z.ANSWER ='Unchecked'` 

如果值是其他方式或完全不同,该怎么办?等等。