原創地址: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日