0

次のようなテーブルがあります (テーブル名 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;
4

2 に答える 2

2

REGEXP_REPLACEを使用した、より一般的なソリューション:

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

これは、ユーザー名フィールドに「/」文字が 1 つだけあることを前提としています。削除される文字列が常に 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
于 2013-09-16T19:19:26.530 に答える