Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/sql/80.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/oracle/9.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Sql 用于识别和替换电子邮件的REGEXP_Sql_Oracle - Fatal编程技术网

Sql 用于识别和替换电子邮件的REGEXP

Sql 用于识别和替换电子邮件的REGEXP,sql,oracle,Sql,Oracle,长话短说,我需要确定一封可能有两种不同结尾的电子邮件: "HREmail@companyabc.com" "HREmail@company.com" 我需要将上述两个示例的实例替换为: "ITEmail@company.com" 我对甲骨文基本上是新手,以下是我目前掌握的信息: CASE WHEN REGEXP_LIKE(EMAIL_LIST, '^HREmail@companyabc.com$', 'i') THEN REGEXP_REPLACE(EMAIL_LIST,'^HREmai

长话短说,我需要确定一封可能有两种不同结尾的电子邮件:

"HREmail@companyabc.com" "HREmail@company.com"

我需要将上述两个示例的实例替换为:

"ITEmail@company.com"

我对甲骨文基本上是新手,以下是我目前掌握的信息:

CASE
    WHEN REGEXP_LIKE(EMAIL_LIST, '^HREmail@companyabc.com$', 'i') THEN REGEXP_REPLACE(EMAIL_LIST,'^HREmail@companyabc.com$', ';ITEmail@company.com;')
    WHEN NOT REGEXP_LIKE(EMAIL_LIST, '^HREmail@companyabc.com$', 'i') THEN EMAIL_LIST || ';ITEmail@company.com;'
    ELSE EMAIL_LIST
END
保存电子邮件的电子邮件列表列包含以“;”分隔的电子邮件。例如:
'email1@company.com;email2@company.com;hremail@companyabc.com;hremail@comapny.com;'
是该列的一行。我想更改它,使上面的行看起来像这样:
email1@company.com;email2@company.com;ITEmail@company.com

检查其中一封电子邮件很容易,而且我知道我可以放一个或。。。并在另一封电子邮件中添加另一个类似REGEXP_的语句,但有没有办法在一个类似REGEXP_的语句中查找这两封电子邮件


谢谢

是的,有。将“abc”设置为可选:

HREmail@company(abc)?\.com$
别忘了在正则表达式中避开圆点

问题:是否需要用
ITEmail@company.com
?这不是代码中的内容。在您的代码中,在第一种情况下是
ITEmail@companyabc.com

如果必须用
ITEmail@company.com
,这很简单。对于更有趣的案例:

regexp_replace(<string>, '^HR(Email@company(abc)?\.com)$', 'IT\1')
编辑(许多问题中的一个)-我在后面的问题中看到,您需要替换为分号分隔的列表,而不是完整的字符串。那么,为什么在您的尝试中使用了^和$anchors呢


不管怎样,你可以把我上面给你的东西改编成一个清单。如果您需要有关该部分的帮助(这与主要问题无关,即如何在单个regexp中处理两个“待替换”字符串)。

电子邮件列表是什么样子的?您的代码使它看起来像包含一个逗号分隔的列表。为了澄清您的问题,请提供几行示例数据以及您想要的结果(以表格文本的形式)。如果您的模式中似乎没有任何变量片段,那么我看不出正则表达式比旧的好。也许我们缺少了一些背景。
with
  sample_inputs(str) as (
    select 'HR@mycompany.com'       from dual union all
    select 'HREmail@company.com'    from dual union all
    select 'ITEmail@company.com'    from dual union all
    select 'HR@companyabc.com'      from dual union all
    select 'HREmail@companyabc.com' from dual union all
    select 'ACEmail@company.com'    from dual
  )
select str as old_str, 
       regexp_replace(str, '^HR(Email@company(abc)?\.com)$', 'IT\1')
         as new_str
from   sample_inputs
;

OLD_STR                  NEW_STR                 
------------------------ ------------------------
HR@mycompany.com         HR@mycompany.com        
HREmail@company.com      ITEmail@company.com     
ITEmail@company.com      ITEmail@company.com     
HR@companyabc.com        HR@companyabc.com       
HREmail@companyabc.com   ITEmail@companyabc.com  
ACEmail@company.com      ACEmail@company.com