我有一个案例陈述:
case when R1 = risk_factor OR R2 = risk_factor then 1 else 0 end
但它也会选择
case when R1 = risk_factor AND R2 = risk_factor then 1 else 0 end
状态的正确语法是什么:
case when (R1 = risk_factor or R2 = risk_factor) BUT NOT (R1 = risk_factor AND R2 = risk_factor) then 1 else 0 end
答案 0 :(得分:4)
(R1 = risk_factor or R2 = risk_factor) BUT NOT (R1 = risk_factor AND R2 = risk_factor)
应该是
(R1 = risk_factor or R2 = risk_factor) AND NOT (R1 = risk_factor AND R2 = risk_factor)
但您也可以使用XOR
(R1 = risk_factor XOR R2 = risk_factor)
逻辑异或。如果任一操作数为NULL,则返回NULL。对于非NULL 操作数,如果奇数个操作数非零,则求值为1, 否则返回0。
但是 - 在特定情况下,您也可以将条件写为
(risk_factor IN (R1, R2) AND R1 <> R2)
注意:如果您的CASE表达式与then 1 else 0
类似,那么根本不需要它。你可以使用布尔表达式。有一个例外:如果您的布尔表达式可以返回NULL并且您想将其转换为0
。但在这种情况下,您也可以使用COALESCE(boolean_expression, 0)
。
答案 1 :(得分:2)
你必须从“最难”的条件开始
case when (R1 = risk_factor AND R2 = risk_factor) then 0
when (R1 = risk_factor OR R2 = risk_factor) then 1
else 0
end