MySQL存储过程
环境 5.6.14
有时候为了省事,在if中使用子查询返回一个值,然后做比较.
就像上述的测试过程.
但是实际执行的时候,过程返回true.基本上忽略了select 的结果,都进入了true的分支.
我觉得MySQL是把where后面的判断作为了比较的内容,上述过程比较的似乎是 if ((1=1)<5),所以无论查询的是什么,都进入了true的分支
解决这个问题的方法也很简单.给子查询加括号
子查询加了括号之后的结果,就正确了,如下图所示.
这不一定是MySQL的bug,但是使用的时候一定需要注意..
环境 5.6.14
- drop procedure if exists p;
- DELIMITER $$
-
- CREATE PROCEDURE `p` ()
- BEGIN
- start transaction;
- if(select 10 from dual where 1=1 < 5 ) then
- select 'true';
- else
- select 'false';
- end if;
- commit;
- END $$
-
- DELIMITER ;
-
-
- 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/