ITPub博客

首页 > 数据库 > MySQL > MySQL存储过程使用if子查询判断需要注意

MySQL存储过程使用if子查询判断需要注意

原创 MySQL 作者:壹頁書 时间:2017-07-24 14:01:10 0 删除 编辑
MySQL存储过程
环境 5.6.14


  1. drop procedure if exists p;
  2. DELIMITER $$

  3. CREATE PROCEDURE `p` ()
  4. BEGIN
  5.     start transaction;
  6.     if(select 10 from dual where 1=1 < 5 ) then
  7.         select 'true';
  8.     else
  9.         select 'false';
  10.     end if;
  11.     commit;
  12. END $$

  13. DELIMITER ;


  14. call p


有时候为了省事,在if中使用子查询返回一个值,然后做比较.
就像上述的测试过程.
但是实际执行的时候,过程返回true.基本上忽略了select 的结果,都进入了true的分支.

我觉得MySQL是把where后面的判断作为了比较的内容,上述过程比较的似乎是 if ((1=1)<5),所以无论查询的是什么,都进入了true的分支

解决这个问题的方法也很简单.给子查询加括号
子查询加了括号之后的结果,就正确了,如下图所示.


这不一定是MySQL的bug,但是使用的时候一定需要注意..

来自 “ ITPUB博客 ” ,链接:https://blog.itpub.net/29254281/viewspace-2142478/ ,如需转载,请注明出处,否则将追究法律责任。

请登录后发表评论 登录
全部评论

注册时间:2013-10-19

  • 博文量
    620
  • 访问量
    6339876