如何对Oracle数据库表中某列的所有数据进行字符串操作?
Posted
技术标签:
【中文标题】如何对Oracle数据库表中某列的所有数据进行字符串操作?【英文标题】:How to do a string operation on all data of a column in an Oracle database table? 【发布时间】:2013-09-16 18:01:56 【问题描述】:我有一个如下表(表名 IDN_CONSUMERS),
| 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;
【问题讨论】:
【参考方案1】:无需编写循环或单独存储新的用户名值。
UPDATE IDN_CONSUMERS SET USERNAME = SUBSTR(USERNAME, 4);
【讨论】:
【参考方案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
【讨论】:
以上是关于如何对Oracle数据库表中某列的所有数据进行字符串操作?的主要内容,如果未能解决你的问题,请参考以下文章