1

前回の質問の続き

私は oracle 11g DB を使用しており、その中の文字列列を操作する必要があります。列には、次の形式で複数の電子メール アドレスが含まれます。

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

私がやりたいことは、末尾に「@gmail.com」がないものをすべて取り出すことです (この例では、admzmoore@outlook.com.com が削除されます)。ただし、admzmoore@outlook.com は、このように、実際の固定形式はありません。唯一の形式は、各アドレスがセミコロンで区切られていることです。

列のすべての行を実行し、@gmail.com 以外のものを削除する 1 つのコマンドでこれを実装する方法はありますか? この種の処理が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

私のオラクルはさびていますが、一見すると、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 に答える