MySQL儲存過程使用if子查詢判斷需要注意

壹頁書發表於2017-07-24
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/,如需轉載,請註明出處,否則將追究法律責任。

相關文章