0

我有一个需要使用的 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
4

2 回答 2

1

如果要过滤 select 语句的结果,以便仅行 where 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') 

只显示那些达到的,

 Select [stuff]
 From tableName
 Where ESF.ID IN  ('727','732','737','813','738','739','740','741','742','743')
           AND b.ANSWER ='Checked'   
于 2013-06-12T21:43:32.027 回答
0

CASE语句以这样的方式处理,即从第一个规则开始一次评估一个规则。一旦满足规则(返回TRUE),就会执行此规则,并CASE结束此语句中的规则检查。

因此,将您的 CASE 重写为:

案例当 ESF.Form_Dim_ID 不在
('727','732','737','813','738','739','740','741','742','743') THEN ' ' WHEN b.ANSWER ='Checked') THEN 'Not Achieved' WHEN Z.ANSWER ='Unchecked') THEN 'Achieved' ELSE '' End 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语句中的每次下一次检查都使用不同的列,并且不满足先前检查的其他组合。例如:

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

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

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

如果价值观完全不同或完全不同怎么办?等等。

于 2013-06-12T21:47:44.157 回答