Sql 如何对Oracle数据库表中列的所有数据执行字符串操作?

Sql 如何对Oracle数据库表中列的所有数据执行字符串操作?,sql,oracle,sql-scripts,Sql,Oracle,Sql Scripts,我有一张像give bellow(表名IDN_CONSUMERS)这样的表 我需要删除所有用户名的ABC/部分,并将修改后的值放回表中,因此最终结果应该是 | USER_ID | USERNAME | | 001A | Anne | | 034K | John | | DF23 | Peter | 我尝试了下面的脚本,但它不工作的原因我不明白。有人能帮我吗 DECLARE NEWUSERNAME VARCHAR2(512); BEGIN FOR I

我有一张像give bellow(表名IDN_CONSUMERS)这样的表

我需要删除所有用户名的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;

不需要编写循环或单独存储新的用户名值

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

不需要编写循环或单独存储新的用户名值

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

更通用的解决方案,使用:

这假定用户名字段中只有一个“/”字符。它并不假定要删除的字符串总是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

更通用的解决方案,使用:

这假定用户名字段中只有一个“/”字符。它并不假定要删除的字符串总是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