1. 程式人生 > >MySql儲存(邏輯判斷/條件控制/迴圈控制)

MySql儲存(邏輯判斷/條件控制/迴圈控制)

同編寫程式類似,儲存過程中也有對應的條件判斷,功能類似於if、switch。在MySql裡面對應的是IF和CASE

1、IF判斷

IF判斷的格式是這樣的:

  1. IF expression THEN commands  
  2.    [ELSEIF expression THEN commands]  
  3.    [ELSE commands]  
  4.    END IF;  
這裡expression是我們的判斷表示式;ELSE IF 和ELSE都是可選的;command就是當條件為真(true為1,false為0)時執行的命令。比如我們設計一個儲存過程用於返回商品的價格,這裡價格通過傳入的引數來判斷是要帶稅收的價格還是沒有帶稅收的價格。先看看錶的資料:


然後下面是我們的儲存過程:


儲存過程的話有兩個輸入引數,第一個isTaxed表示是不是要帶稅價格,第二個是產品的名稱;在儲存過程裡面定義了兩個變數,finalPrice用來儲存價格,而taxRate表示稅率。這裡程式碼比較簡單,就是判斷下如果是要加稅,就把原來的價格乘上稅率。下面是測試結果:

true的情況表示是帶稅的價格。好了這個是使用IF的一個例子,下面看看CASE;

2、CASE的使用

同程式設計裡面的那個switch ....case.....類似,使用CASE同程式設計一樣也是當判斷比較多時便於閱讀和維護,我們也來看下CASE的語法:

下面我們假設不同型別的商品對應的稅收稅率是不一樣的情況來看個例子,這裡假設甜點的稅率是0.05,奶製品的是0.1,傢俱類的是0.2:,下面是儲存過程:


上面增加了一個儲存產品型別的一個變數proType,用來儲存商品型別。然後使用CASE來進行判斷來設定稅率,下面是測試的部分:

可以看到沙發的價格是1250*1.2=1500,而蛋糕的價格是10*1.05 = 10.5



在MySql的儲存過程中可使用的迴圈有三種:WHILE、REPEAT、LOOP

1、WHILE

WHILE的格式是這樣的:

  1. WHILE expression DO  
  2.    Statements  
  3. END WHILE  
下面是個例子
  1. DELIMITER $$  
  2. DROPPROCEDURE IF EXISTS `test`.`WhileLoopProc` $$  
  3. CREATEPROCEDURE `test`.`WhileLoopProc` ()  
  4. BEGIN
  5.  DECLARE x  INT;  
  6.  DECLARE str  VARCHAR(255);  
  7.  SET x = 1;  
  8.  SET str =  '';  
  9.  WHILE x  <= 5 DO  
  10.      SET  str = CONCAT(str,x,',');  
  11.      SET  x = x + 1;  
  12.  END WHILE;  
  13.  SELECT str;  
  14. END $$  
  15. DELIMITER ;  
上面的例子最後輸出“1,2,3,4,5,”這樣的字元。

2、REPEAT

REPEAT的格式是這樣的:

  1. REPEAT  
  2. Statements;  
  3. UNTIL expression  
  4. END REPEAT  
REPEAT好比我們程式設計裡面的do...while一樣。這邊例子就不舉了,同上面的類似。

3、LOOP 及 LEAVE、ITERATE

這裡LOOP用來標記迴圈;而LEAVE表示離開迴圈,好比程式設計裡面的break一樣;ITERATE則繼續迴圈,型別與程式設計裡面的continue。

  1. DELIMITER $$  
  2. DROPPROCEDURE IF EXISTS `test`.`LoopProc` $$  
  3. CREATEPROCEDURE `test`.`LoopProc` ()  
  4. BEGIN
  5. DECLARE x  INT;  
  6. DECLARE str  VARCHAR(255);  
  7. SET x = 1;  
  8. SET str =  '';  
  9. loop_label:  LOOP  
  10.   IF  x > 10 THEN
  11.    LEAVE  loop_label;  
  12.   END  IF;  
  13.   SET  x = x + 1;  
  14.   IF  (x mod 2) THEN
  15.    ITERATE  loop_label;  
  16.   ELSE
  17.    SET  str = CONCAT(str,x,',');  
  18.   END  IF;  
  19. END LOOP;  
  20. SELECT str;  
  21. END $$  
  22. DELIMITER ;  
上面程式碼輸出10以內的偶數,用逗號分隔。這裡注意到x>10的時候就LEAVE掉,如果遇到奇數則ITERATE,奇數對2取模為1,表示true