2017-04-15 29 views
2

我有一個case語句:MySQL的CASE當任一但不能同時

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 

回答

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。

Documentation

但是 - 在侑具體情況下,你也可以寫條件爲

(risk_factor IN (R1, R2) AND R1 <> R2) 

注意:如果你的CASE表達式類似then 1 else 0,那麼你不需要它了。你可以使用布爾表達式。有一個例外:如果您的布爾表達式可以返回NULL並且您想將其轉換爲0。但在這種情況下,您也可以使用COALESCE(boolean_expression, 0)

+2

像'異或'運算符 – haz

+1

@hb所以從現在開始,您將能夠識別XOR模式,這很好! –

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