我有一个我需要使用的案例陈述结果。我想把它放在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
答案 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'`
如果值是其他方式或完全不同,该怎么办?等等。