Если я использую replace(email, ';', ''), он удалит все ';' от значения, которое имеет список электронных писем. Мое требование состоит в том, что необходимо будет удалить только патичную электронную почту вместе с ';' если это в конце или в начале этого конкретного электронного письма. НАПРИМЕР:

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 ;
0
Ganesan VC 21 Ноя 2019 в 14:52

2 ответа

Лучший ответ

Один метод использует trim() и replace():

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

Тем не менее, я бы порекомендовал другую модель данных. У Oracle есть много альтернативных решений для хранения списков вещей - от традиционной таблицы соединений / связей до JSON и вложенных таблиц.

1
Gordon Linoff 21 Ноя 2019 в 12:16

Вы можете попробовать использовать replace + replace:

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

Вот DEMO.

1
VBoka 21 Ноя 2019 в 11:57