【问题标题】:Find pattern and Replace 16 to 20 character after the pattern查找模式并替换模式后的 16 到 20 个字符
【发布时间】:2017-10-22 09:46:31
【问题描述】:

我们在oracle数据库中有一个表,需要替换CLOB列中的部分数据。

要求替换总是出现在 ADAC 关键字之后的 16 到 20 字符长的帐号

输入字符串 = 'ADAC 1345HFT5678MK 345WE' 预期输出='ADAC XXXXXXXXXXXXXXXXXXX'

使用 regexp_replace 是否可行?

【问题讨论】:

  • 谢谢阿努拉格。在您提供的输入字符串中,有 13 个字符,然后是一个空格,然后是 5 个字符。空格是帐号的一部分吗?正如您提到的,帐号长度为 16 到 20 个字符,这将有助于了解如何分隔替换目标。谢谢
  • 添加到 alexgibbs 的问题:在您的 CLOB 中,帐号后面可能有以下任何一个:逗号,,句点.,分号;,换行chr(10)chr(13) || chr(10),字符串结束$... 请提前考虑所有这些可能性(在考虑问题的解决方案之前;它们是问题本身的一部分!)并说明应该如何处理。

标签: oracle regexp-replace


【解决方案1】:

需要注意的是,这种替换通常可以使用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 没有符合条件的帐号。

【讨论】:

    猜你喜欢
    • 2013-10-23
    • 2017-04-23
    • 1970-01-01
    • 2011-12-08
    • 2021-07-28
    • 1970-01-01
    • 1970-01-01
    • 2013-02-26
    • 1970-01-01
    相关资源
    最近更新 更多