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