• 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日

  • 相关阅读:
    ognl的应用1
    未命名
    flash钟表的实现
    文本显示输入字数
    HttpServlet session的用法: (2)
    $.fx与$.fn.fx 区别
    javascript 事件冒泡 和 冒泡事件阻止
    (function($){...})(jQuery) 含义
    选择城市插件 jQuery
    offset().left 用法
  • 原文地址:https://www.cnblogs.com/QQ826688096/p/10713370.html
Copyright © 2020-2023  润新知