oracle 批量更新之update case when then
CreationTime--2018年8月7日15點51分
Author:Marydon
1.情景描述
根據表中同一字段不同情況下的值修改為對應的內容,如何實現?
使用case when then else end語句。
2.錯誤用法
沒有else語句,將會導致全表更新

證實:
結果展示:

說明:更新的是全表記錄,而不是更新的只是符合上面三種情況的記錄;
不在情況范圍內的,執行的是將該字段值置空,sql語句相當於:
UPDATE BASE_AC_MODULE_BAK T
SET T.MODULEICON = CASE
WHEN T.MODULEICON = '/commons/images/img/add.gif' THEN
'/commons/images/img/add.png'
WHEN T.MODULEICON = '/commons/images/img/edit.gif' THEN
'/commons/images/img/update.png'
WHEN T.MODULEICON = '/commons/images/img/delete.gif' THEN
'/commons/images/img/delete.png'
ELSE
NULL
END
3.case when then else end語法
用法一:簡單case語句
CASE SEX WHEN '1' THEN '男' WHEN '2' THEN '女' ELSE '其他' END
用法二:case搜索語句
CASE WHEN SEX = '1' THEN '男' WHEN SEX = '2' THEN '女' ELSE '其他' END
用法說明:
與java的switch語句不同是,如果不聲明ELSE語句,oracle會自動添加ELSE語句(ELSE NULL),當數據出現與case的情況都不匹配時,
顯示的不是原數據,而是空值;

必須有END關鍵詞聲明結束CASE語句;
另外,需特別注意的是:使用CASE語句,無論是查詢還是修改語句,在不加限制條件的情況下,默認是對全表進行操作!
4.正確用法
方法一
UPDATE BASE_AC_MODULE_bak T
SET T.MODULEICON = CASE
WHEN T.MODULEICON = '/commons/images/img/add.gif' THEN
'/commons/images/img/add.png'
WHEN T.MODULEICON = '/commons/images/img/edit.gif' THEN
'/commons/images/img/update.png'
WHEN T.MODULEICON = '/commons/images/img/delete.gif' THEN
'/commons/images/img/delete.png'
ELSE
T.MODULEICON
END
WHERE (T.MODULEICON = '/commons/images/img/add.gif' OR
T.MODULEICON = '/commons/images/img/delete.gif' OR
T.MODULEICON = '/commons/images/img/edit.gif')

else為什么可以省略?
更新加上限制條件后,只有16條數據符合要求並進行修改,不存在else的情況。
方法二:限制條件加在where后,多個條件之間使用or
UPDATE BASE_AC_MODULE_BAK T
SET T.MODULEICON = DECODE(T.MODULEICON,
'/commons/images/img/add.gif',
'/commons/images/img/add.png',
'/commons/images/img/edit.gif',
'/commons/images/img/update.png',
'/commons/images/img/delete.gif',
'/commons/images/img/delete.png')
WHERE (T.MODULEICON = '/commons/images/img/add.gif' OR
T.MODULEICON = '/commons/images/img/delete.gif' OR
T.MODULEICON = '/commons/images/img/edit.gif')
