1. 程式人生 > >MYSQL中IF, IFNULL, CASE WHEN的使用

MYSQL中IF, IFNULL, CASE WHEN的使用

CASE WHEN

兩種寫法 

1.

SELECT 
CASE WHEN status=1 THEN 'status1'  -- 當status=1時,返回值為狀態1
WHEN status=2 THEN 'status2' -- 當status=1時,返回值為狀態1
ELSE 'other'
END 
FROM table
2.
SELECT 
CASE                  
status           
WHEN '1' THEN '狀態1'  -- 當status=1時,返回值為狀態1
WHEN '2' THEN '狀態2'  -- 當status=2時,返回值為狀態2
ELSE status            -- 否則返回值為status對應的值
END AS status 
FROM table 

幾個需要注意的問題:

1.else 必須有,不寫else,返回值為null,以前的資料就沒了。

2.case函式只返回第一個符合條件的值,剩下的case部分將會被自動忽略

比如

CASE WHEN status='1' THEN '開啟'
WHEN status='1' THEN '關閉'

返回值為“開啟”

3.可以 ORDER BY 但是不能做WHERE中的判斷語句

CASE WHEN status=1 THEN 'status1'
WHEN status=2 THEN 'status2'
ELSE status
END AS caseStatus
ORDER BY caseStatus 正確
WHERE caseStatus=1  錯誤

4. 注意判斷null的寫法

SELECT CASE status WHEN '1' THEN 'open'
WHEN NULL THEN 'close' 
這種為錯誤寫法,完整就是status=null, 判斷是否為空用IS NULL

5.根據條件有選擇的UPDATE。參考點選開啟連結

例,有如下更新條件 

工資5000以上的職員,工資減少10% 
工資在2000到4600之間的職員,工資增加15% 
很容易考慮的是選擇執行兩次UPDATE語句,如下所示 

--條件1 
UPDATE Personnel 
SET salary = salary * 0.9 
WHERE salary >= 5000; 
--條件2 
UPDATE Personnel 

SET salary = salary * 1.15 
WHERE salary >= 2000 AND salary < 4600; 

但是事情沒有想象得那麼簡單,假設有個人工資5000塊。首先,按照條件1,工資減少10%,變成工資4500。接下來執行第二個SQL時候,因為這個人的工資是4500在2000到4600的範圍之內, 需增加15%,最後這個人的工資結果是5175,不但沒有減少,反而增加了。如果要是反過來執行,那麼工資4600的人相反會變成減少工資。暫且不管這個規章是多麼荒誕,如果想要一個SQL 語句實現這個功能的話,我們需要用到Case函式。程式碼如下: 

UPDATE Personnel 
SET salary = CASE WHEN salary >= 5000 
             THEN salary * 0.9 
WHEN salary >= 2000 AND salary < 4600 
THEN salary * 1.15 
ELSE salary END; 

這裡要注意一點,最後一行的ELSE salary是必需的,要是沒有這行,不符合這兩個條件的人的工資將會被寫成NUll,那可就大事不妙了。在Case函式中Else部分的預設值是NULL,這點是需要注意的地方。 
這種方法還可以在很多地方使用,比如說變更主鍵這種累活。 

IFNULL(expr1,expr2)

如果expr1不為null,則返回值為expr1,否則expr2。返回值是數字還是字串,具體情況取決於其使用的語境。

IF(expr1,expr2,expr3)

如果expr1為true,則結果為expr2,否則結果為expr3