我们在oracle数据库中有一个表,CLOB列中的数据部分需要替换。
要求是替换16到20个字符长的帐号,它总是出现在ADAC关键字之后
输入字符串='ADAC 1345HFT5678MK 345WE' 预期输出='ADAC XXXXXXXXXXXXXXXXXXX'
是否可以使用regexp_replace?
答案 0 :(得分:0)
有一些警告,通常可以使用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则没有符合条件的帐号。