2

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

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

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

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

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

4

2 回答 2

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 

这是一个演示

于 2012-09-12T16:49:43.197 回答
1

这个答案实际上是针对 SQL Server 的,因为这就是我所知道的。话虽如此,也许有一个如何在一个系统中执行此操作的示例将使您了解如何在您的系统中执行此操作。或者也许有一种方法可以将代码转换为 Oracle 中相同类型的东西。

一、思考过程: 在 SQL Server 中结合FOR XML PATHSTUFF功能允许您制作一个逗号分隔的列表。我在其中添加了一个WHERE Split.SplitValue LIKE ...子句以将其过滤为仅 gmail 地址。我将整个事情交叉应用到主表中,并将其转换为过滤后的电子邮件列表。然后,您可以进一步过滤主表以在更有针对性的一组行上运行它。

二、SQL Server实现:

SELECT
    *
FROM @Table Base
CROSS APPLY 
(
    SELECT
        STUFF(
            (SELECT
                ';' + Split.SplitValue AS [text()]
            FROM dbo.fUtility_Split(Base.Emails, ';') Split
            WHERE Split.SplitValue LIKE '%@gmail.com'
            FOR XML PATH (''))
        , 1, 1, '') Emails
) FilteredEmails

编辑:我忘了提到这个答案需要你有某种函数来根据分隔符值拆分字符串列。如果你还没有那个,然后谷歌它。有很多例子。

于 2012-09-12T16:20:22.730 回答