2013-09-16 18 views
0

我喜歡給波紋管(表名IDN_CONSUMERS)的表,如何對Oracle數據庫表中的列的所有數據執行字符串操作?

| USER_ID | USERNAME | 
| 001A | ABC/Anne | 
| 034K | ABC/John | 
| DF23 | ABC/Peter | 

我需要刪除所有的用戶名的ABC /部分,並將修改後的值回表,所以最終的結果應該是像,

| USER_ID | USERNAME | 
| 001A | Anne  | 
| 034K | John  | 
| DF23 | Peter | 

我嘗試了下面的腳本,但它不工作的原因,我不明白。任何人都可以幫助我嗎?

DECLARE 
NEWUSERNAME VARCHAR2(512); 

BEGIN 

FOR ID IN (SELECT USER_ID FROM IDN_CONSUMERS) LOOP 

SELECT SUBSTR((SELECT USERNAME FROM IDN_CONSUMERS WHERE USER_ID='||ID||'), 4) INTO NEWUSERNAME FROM DUAL; 

UPDATE IDN_CONSUMERS SET USERNAME='||NEWUSERNAME||' WHERE USER_ID='||ID||'; 

END LOOP; 

END; 

回答

2

無需編寫循環或分別存儲新的用戶名值。

UPDATE IDN_CONSUMERS SET USERNAME = SUBSTR(USERNAME, 4); 
+0

這解決了這個問題。非常感謝你。 – SureshAtt

2

更一般的解決方案,使用REGEXP_REPLACE

UPDATE idn_consumers 
    SET username = REGEXP_REPLACE(username, '.*/'); 

這並假設存在將只有一個在用戶名字段 '/' 字符。它並不假定要移除的字符串總是4個字符長,或者它們的長度都是相同的。

如果你的數據可以包含多個 '/',你可以使用:

UPDATE idn_consumers 
    SET username = REGEXP_REPLACE(username, '[^/]*/','',1,1); 

例如:

SQL> SELECT REGEXP_REPLACE('ABC/An/ne', '[^/]*/','',1,1) new_name FROM dual; 

NEW_NAME 
-------- 
An/ne 
+0

感謝您的答覆隊友。 – SureshAtt

相關問題