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日

posted @ 2019-04-12 15:53  DMY小天天  阅读(1800)  评论(0编辑  收藏  举报