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

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博客 ” ,链接:http://blog.itpub.net/29254281/viewspace-2142478/,如需转载,请注明出处,否则将追究法律责任。

转载于:http://blog.itpub.net/29254281/viewspace-2142478/

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值