case when / if else-if 的大坑,要當心!!!


原創地址:https://blog.csdn.net/QQ826688096/article/details/89242180

今天我在寫業務代碼的時候,明明用頭腦想是可以通過的,但是實際執行結果就是不如意。代碼也不報錯,哪哪兒都看不出錯誤來,真是急死我了。最終還是讓我一點點找到了問題所在。

問題就出現在sql中的case when的各個判斷里面。

先看下面的案例:

select case
         when x=1 then 'true'
         when x=2 then 'false'
         when x>=2 then 'true'
         else 'false'
       end ret
from (select 2 as x from dual);

這個sql的執行結果是false,這就是我們都知道但很容易遺漏的知識點,case when 會一直執行,直到找到符合條件的那行后才會跳出循環。暫且理解為這是他的本性吧。

這本來是很正常的事情。

但是,有一點,他只要找到符合條件的語句后,執行完就跳出了。

上面的sql代碼中,當x=2的時候,case找到了符合條件的數據行了,所以執行完后帶着結果就跳出了,但是后面還有一個x>=2的條件也是符合條件的數據,就不會被執行了。

這個其實跟java里面的代碼一樣的道理:

if(x==2){
    syso("false");
}else if(x>=2){
    syso("true");
}

這里本人暫時只有兩個方案可以解決:

1,將所有結果是“true”的結果條件放到所有結果為“false”的前面,因為首先要執行為true的語句,也就是說,不會漏掉為true的結果。

select case
         when x=1 then 'true'
         when x>=2 then 'true'
         when x=2 then 'false'         
         else 'false'
       end ret
from (select 2 as x from dual);

2,將if(xxx) else if(xxx),都修改成if(xxx);  if(xxx)。就可以了。因為每個if都會被執行。而else if是只有當同級別的if或者是else if不符合條件的時候才會走的。

if(x==2){
    syso("false");
}
if(x>=2){
    syso("true");
}

2019年4月12日


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM