【问题标题】:How to do a string operation on all data of a column in an Oracle database table?如何对Oracle数据库表中某列的所有数据进行字符串操作?
【发布时间】: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;

【问题讨论】:

    标签: sql oracle sql-scripts


    【解决方案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
      

      【讨论】:

        猜你喜欢
        • 2012-08-19
        • 2012-10-06
        • 1970-01-01
        • 2012-11-07
        • 1970-01-01
        • 2021-05-08
        • 2017-10-06
        • 1970-01-01
        • 2012-07-05
        相关资源
        最近更新 更多