我正在尝试使用“;”删除电子邮件包含多个电子邮件的列中的值

时间:2019-11-21 11:52:35

标签: sql oracle

如果我使用replace(email, ';', ''),它将删除所有的';'从具有电子邮件列表的值。我的要求是,仅需要删除特殊电子邮件以及“;”如果是特定电子邮件的结尾还是开头。 EG:

abc@yahoo.com;efg@yahoo.com;hij@yahoo.com;ab1@yahoo.com 

如果我想删除abc@yahoo.com;那么结果应该是

efg@yahoo.com;hij@yahoo.com;ab1@yahoo.com 

或者如果我想删除hij@yahoo.com;那么结果应该是

abc@yahoo.com;efg@yahoo.com;ab1@yahoo.com

查询:

DECLARE 

  v_sql    VARCHAR2(5000); 
  v_email VARCHAR2(5000):= 'abc@yahoo.com';

  v_sql:=UPDATE L05460176.SI_Recipient set email = case when (:1||';') then replace (lower (replace (email, :1||';' )), chr(32),'')  
                            when (';'||:1) then email =  replace (lower (replace (email, ';'||:1 )), 
chr(32),'') WHERE EVENT = 'XYZ'

  EXECUTE IMMEDIATE v_sql 
  USING v_email ;

2 个答案:

答案 0 :(得分:1)

一种方法使用trim()replace()

trim(both ';' from
     replace(';' || emails || ';', ';' || 'hij@yahoo.com' || ';', ';')
    ) 

也就是说,我建议使用其他数据模型。 Oracle提供了许多替代方案来存储事物列表-从传统的联结/关联表到JSON再到嵌套表。

答案 1 :(得分:1)

您可以尝试使用replace + replace:

select 
replace(replace('efg@yahoo.com;hij@yahoo.com;ab1@yahoo.com', 'hij@yahoo.com', ''), ';;', ';') 
from dual;

这里是DEMO