MYSQL中IF, IFNULL, CASE WHEN的使用
阿新 • • 發佈:2019-02-14
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 NULL5.根據條件有選擇的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