SQL'FROM'不在预期的位置

时间:2012-09-28 13:51:02

标签: sql database oracle oracle11g

上一个问题的后续行动

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

jgoozooll@gmail.com; dzhookep@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

任何人都可以伸出援手吗?

谢谢你们。

2 个答案:

答案 0 :(得分: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

答案 1 :(得分:1)

我的甲骨文很生疏,但是首先看看你在LISTAGG功能之后错过了一个逗号。

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