2

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

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

私がやりたいのは、最後に「@ gmail.com」がないものをすべて削除することです(この例ではamoore@outlook.comは削除されます)が、amoore@outlook.comが次の行の最初の電子メールである可能性がありますこのように、実際の固定形式はありません。唯一の形式は、各アドレスがセミコロンで区切られていることです。

1つのコマンドでこれを実装して、列のすべての行を実行し、@ 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

私が知っているのは、この答えは実際にはSQLServerに関するものです。そうは言っても、おそらく1つのシステムでそれを行う方法の例があると、自分のシステムでそれを行う方法のアイデアが得られます。あるいは、コードをOracleで同じタイプのものに変換する方法があるかもしれません。

まず、思考プロセス:SQL Serverでは、FOR XML PATHSTUFF機能を組み合わせることで、コンマ区切りのリストを作成できます。これに句を追加して、WHERE Split.SplitValue LIKE ...Gmailアドレスのみにフィルタリングします。このすべてをメインテーブルにクロスアプライすると、フィルタリングされたメーリングリストになります。次に、メインテーブルをさらにフィルタリングして、よりターゲットを絞った行のセットでこれを実行できます。

次に、SQLServerの実装:

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 に答える