1

上一个问题的后续

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

jgoozooll@gmail.com;dzookep@gmail.com;admzmoore@outlook.com

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

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

在以下代码中出现上述“FROM”错误,我终生无法弄清楚原因。有人可能会让我看起来很愚蠢,但我必须抓住这个机会。可能还有其他错误:) 这是我的代码:

 SELECT REMIT_TO.ID
 , LISTAGG(EMAIL, ';') WITHIN GROUP(ORDER BY REMIT_TO.ID) REMIT_TO.EFT_EMAIL_ADDR

 FROM (SELECT REMIT_TO.ID 
        , regexp_substr(REMIT_TO.EFT_EMAIL_ADDR, '[^;]+', 1, RN) email

    FROM IQMS.REMIT_TO
    CROSS JOIN (SELECT ROWNUM RN
                   FROM(SELECT MAX (REGEXP_COUNT(REMIT_TO.EFT_EMAIL_ADDR, '[^;]+')) ML
                          FROM IQMS.REMIT_TO
                        )
                       CONNECT BY LEVEL <= ML
                  )
     )                             
 WHERE EMAIL LIKE '%@gmail.com%'
 GROUP BY REMIT_TO.ID

对任何人来说有什么突出的吗?

谢谢你们。

4

2 回答 2

2

您的子查询中似乎缺少一些别名:

SELECT REMIT_TO.ID
 , LISTAGG(EMAIL, ';') WITHIN GROUP(ORDER BY REMIT_TO.ID) REMIT_TO.EFT_EMAIL_ADDR
FROM 
(
  SELECT REMIT_TO.ID 
        , regexp_substr(REMIT_TO.EFT_EMAIL_ADDR, '[^;]+', 1, RN) email
  FROM IQMS.REMIT_TO REMIT_TO
  CROSS JOIN 
  (
    SELECT ROWNUM RN
    FROM
    (
      SELECT MAX (REGEXP_COUNT(REMIT_TO.EFT_EMAIL_ADDR, '[^;]+')) ML
      FROM IQMS.REMIT_TO
    ) x2 -- alias needed
    CONNECT BY LEVEL <= ML
  ) x1   -- alias needed  
) REMIT_TO   -- alias needed                         
WHERE EMAIL LIKE '%@gmail.com%'
GROUP BY REMIT_TO.ID
于 2012-09-28T13:59:15.297 回答
1

我的 Oracle 是一个生锈的工具,但乍一看你在 LISTAGG 函数之后缺少一个逗号。

SELECT REMIT_TO.ID
 , LISTAGG(EMAIL, ';') WITHIN GROUP(ORDER BY REMIT_TO.ID)
 , REMIT_TO.EFT_EMAIL_ADDR...
于 2012-09-28T14:09:39.437 回答