需要注意的是,这种替换通常可以使用regexp_replace 完成。我将在下面添加一个示例,它使用空格作为分隔符来查找 ADAC 关键字和以下帐号。 (如果帐号中允许有空格,则需要调整)
这是这种替换的示例。
创建测试表:
CREATE TABLE ACCOUNT_REPLACEMENT(
ACCOUNT_ID NUMBER,
ACCOUNT_DATA CLOB
);
还有一些测试数据:
INSERT INTO ACCOUNT_REPLACEMENT VALUES (1,'#_# ADAC 1345HFT5678MK_345WE 359e,ne');
INSERT INTO ACCOUNT_REPLACEMENT VALUES (2,'143cN ADAC 1345HFT5678MK_345WE Wookie');
INSERT INTO ACCOUNT_REPLACEMENT VALUES (3,'ADAC 1234567890123456 ADACADAC ADAC abcdefghijklmnopqrst');
INSERT INTO ACCOUNT_REPLACEMENT VALUES (4,'ADAC abcdefghijklmnopqrstuvxyz');
初始状态:
SELECT * FROM ACCOUNT_REPLACEMENT ORDER BY 1 ASC;
ACCOUNT_ID ACCOUNT_DATA
1 #_# ADAC 1345HFT5678MK_345WE 359e,ne
2 143cN ADAC 1345HFT5678MK_345WE Wookie
3 ADAC 1234567890123456 ADACADAC ADAC abcdefghijklmnopqrst
4 ADAC abcdefghijklmnopqrstuvxyz
然后进行更新。
此更新将查找任何 ADAC 键后跟一个空格,前面是一个空格或行开始,并用 20 个 X 字符更新以下 16-20 个字符。但如果帐号包含超过 20 个字符,则不会执行任何操作。
此更新将有效帐号限制为 [0-9a-zA-Z_],但可以进行调整以允许其他有效帐号。
UPDATE ACCOUNT_REPLACEMENT
SET ACCOUNT_DATA = REGEXP_REPLACE(ACCOUNT_DATA,
'(^| )(ADAC )([0-9a-zA-Z_]{16,20})( |$)',
'\1\2XXXXXXXXXXXXXXXXXXXX\4');
4 rows updated.
然后查看结果:
SELECT * FROM ACCOUNT_REPLACEMENT
ORDER BY 1 ASC;
ACCOUNT_ID ACCOUNT_DATA
1 #_# ADAC XXXXXXXXXXXXXXXXXXXX 359e,ne
2 143cN ADAC XXXXXXXXXXXXXXXXXXXX Wookie
3 ADAC XXXXXXXXXXXXXXXXXXXX ADACADAC ADAC XXXXXXXXXXXXXXXXXXXX
4 ADAC abcdefghijklmnopqrstuvxyz
这里account_id 1 和2 中的帐号被隐藏了。 account_id 3 有两个符合条件的匹配项需要隐藏,而 account_id 4 没有符合条件的帐号。