SQL质量字符串操作

Dam*_*ran 2 sql database oracle

我正在使用oracle DB并且需要在其中操作字符串列.该列包含以下格式的多个电子邮件地址:

jgooooll@gmail.com; dhookep@gmail.com; amoore@outlook.com

我想要做的是拿出最后没有 '@ gmail.com'的东西(在这个例子中amoore@outlook.com将被删除)但是amoore@outlook.com可能是下一行中的第一封电子邮件因此以这种方式没有真正的固定格式,唯一的格式是每个地址用分号分隔.

无论如何通过一个命令实现这一点来贯穿列中的每一行并删除任何不是@ gmail.com的东西?我不确定SQL中是否可以进行这种处理.只是在寻找你的想法!!

非常感谢你们.期待您的来信!

Nic*_*nov 6

仅适用于Oracle 11g(11.2).因为listagg功能仅在11.2以后支持.如果您使用10.1及更高版本11.1,则可以编写自己的字符串聚合函数或使用函数.

with T1 as (
  select 1 id, 'jhd@jk.com;jgooooll@gmail.com;dhookep@gmail.com;amoore@outlook.com' emails from dual union all
  select 2 id, 'jhd@jk.com;jgooooll@gmail.com;dhookep@gmail.com;amoore@outlook.com' emails from dual 
) 

select id
     , listagg(email, ';') within group(order by id) emails
  from (select id 
             , regexp_substr(emails,'[^;]+', 1, rn) email 
          from t1 
         cross join (select rownum rn
                       from(select max (regexp_count(emails, '[^;]+')) ml
                              from t1
                            )
                           connect by level <= ml      
                      )
         )                             
where email like '%@gmail.com%'
group by id

Id               Emails 
--------------------------------------
1     dhookep@gmail.com;jgooooll@gmail.com 
2     dhookep@gmail.com;jgooooll@gmail.com 
Run Code Online (Sandbox Code Playgroud)

这是一个演示