(一) 將數字替換成漢字
第一步,去重查詢
使用distinct關鍵字先對該字段值進行去重查詢,看共有幾種情況
--查詢指定區間內表停診字段的值 SELECT DISTINCT T.CLOSE_TZ FROM CONSULT_SCHEDULE T WHERE T.SCHEDULE_DATE BETWEEN TO_DATE('2018-01-01', 'yyyy-MM-dd') AND TO_DATE('2018-02-28', 'yyyy-MM-dd');
查詢結果:共有3種情況
第二步,區分不同的數值並更新對應的漢字
0改為是,1改為否
使用decode函數實現
--正確sql UPDATE CONSULT_SCHEDULE T SET T.REPLACE_TZ = DECODE(REPLACE_TZ, '1', '否', '0', '是') WHERE T.REPLACE_TZ IN ('0', '1') AND T.SCHEDULE_DATE BETWEEN TO_DATE('2018-01-01', 'yyyy-MM-dd') AND TO_DATE('2018-02-28', 'yyyy-MM-dd');
易錯點說明:
錯誤一
--錯誤sql1:CLOSE_TZ字段是varchar2類型 UPDATE CONSULT_SCHEDULE T SET T.CLOSE_TZ = DECODE(CLOSE_TZ, 1, '否', 0, '是') WHERE T.SCHEDULE_DATE BETWEEN TO_DATE('2018-01-01', 'yyyy-MM-dd') AND SYSDATE;
解析:CLOSE_TZ字段是varchar2類型,1和0是number類型
錯誤二:使用decode()函數必須加上限制條件,否則默認執行的是全表更新!
--錯誤sql2:使用decode()函數,不在指定的情況會被置空 UPDATE CONSULT_SCHEDULE T SET T.CLOSE_TZ = DECODE(CLOSE_TZ, '1', '否', '0', '是') WHERE T.SCHEDULE_DATE BETWEEN TO_DATE('2018-01-01', 'yyyy-MM-dd') AND SYSDATE;
更新后,再次執行上面的查詢語句
原因:根據第一個查詢執行的結果,可以得出正確的結果應該使用是和否這2種情況,但這卻是3種情況
解析:這是因為decode函數使用不當造成的,應該將不需要更改的列去除掉。
小技巧:在修改數據庫數據時,執行update語句后,一定不要急着提交,執行一次查詢看看是否是自己想要的結果,再提交。
(二)將一個字段的值給另一字段
UPDATE VIRTUAL_CARD T SET T.ID_CARD=T.CARDNUM WHERE T.ID_CARD IS NULL;
(三)批量修改表字段中指定字符
UpdateTime--2017年8月23日08:44:34
1.1.22 替換字段中指定字符串
--將PATIENT_AUTO_IMAGEINFO表中字段IMAGE_ADRESS中的#號轉換成_ UPDATE PATIENT_AUTO_IMAGEINFO SET IMAGE_ADRESS = REPLACE(IMAGE_ADRESS, '#', '_') WHERE IMAGE_ADRESS LIKE '%#%'
(四)根據ID批量修改
UPDATE TSORGDIAITEM set FSTATUS = ?, FAUDITER = ?, FAUDDATE = SYSDATE WHERE FID IN (15632875, 15612443)