2008-06-04

CASE 指令,MySQL 的 switch 與 if else

今天在玩 CASE 這個指令,雖然已經在同學 黑色 深淵 的 Blog 中看到過了,為了明確瞭解這個指令的語法及功能,今天花了一點時間實證。
  1. 必須依附在 SELECT,UPDATE,INSERT,DELETE 下
  2. 不可用在區段中加其他動作
  3. 具有 switch 與 if else 兩種架構

-- switch 的用法
SELECT CASE col
    WHEN 100 THEN '1'
    WHEN 50 THEN '2'
    ELSE '3'
END
FROM table;

-- if else 的用法
SELECT CASE
    WHEN col>100 THEN '1'
    WHEN col>50 THEN '2'
    ELSE '3'
END
FROM table;


在需要對欄位做多種情況區分時,這個指令就很好用,可惜不行加入其他動作,例如:
CASE 
    WHEN EXISTS(SELECT * FROM table WHERE id=1)
    THEN (UPDATE table SET txt='test' WHERE id=1)
    ELSE (INSERT INTO table(id,txt) VALUES(1,'text'))
END;


參考文件:
MySQL 5.1 Reference Manual :: 21.2.10.2 CASE Statement
mysql语句中用if的例子

4 則留言:

  1. 你好!
    請問一下,我現在需要新增欄位,但我希望能先判斷,避免錯誤產生後中斷script執行。
    看了你的文章後,我依樣畫葫蘆
    CASE WHEN
    EXISTS (select ord_code from i25data)
    THEN (select * from i25data)
    ELSE (ALTER TABLE `i25data` ADD COLUMN `ORD_CODE` VARCHAR(16) AFTER `DAYPRT1`)
    END;
    不曉得這樣是否可以直接執行?
    還是需要另外加甚麼script才可以?
    謝謝你的幫助!

    回覆刪除
  2. 很抱歉給你錯誤的資訊
    在文章中我有提到這個作法在 MySQL 中是不可行的
    MySQL 中是沒有 script 的流程控制
    如果你一定要使用 script
    MySQL 只有預存函數有支援完整 script 流程

    這個部分我做過很多次的實驗了
    在一般 query 中是沒辦法達成的
    除非你使用更完整 SQL Database (MSSQL,Oracle)

    回覆刪除
  3. 非常感謝你的回覆!
    我了解你文章的意思了!
    是我誤會。
    再次感謝!

    回覆刪除
  4. 請問使用Case when 或 IF,可以輸出原本欄位的值嗎 ? 如: IF (FinishTime<'2010-11-12',FinishTime,'2010-11-12') 也就是如果FinishTime小於2010-11-12,我就取FinishTime欄位值,否則輸出2010-11-12的日期,試的結果好像都無法成功 ?

    回覆刪除

你好!歡迎你在我的 Blog 上留下你寶貴的意見。