0

したがって、基本的に私は複数の電子メールの列を持っており、それらのいくつかは無効であり、許可されていない異なる文字/キャリッジリターンが含まれています。

以下は、selectステートメントで無効なメールを見つける方法ですが、個別に置き換える方法がわかりません。たとえば、キャリッジリターンが見つかった場合は、replaceステートメントを使用します。特殊文字と同じです。しかし、それには、考えられるケースごとに個別のクエリを作成する必要がありますか?

基本的に、私が求めているのは、これらのケースステートメントの1つに一致する電子メールアドレス内の文字を置き換えるために、テーブルを反復処理するための最も効率的な方法です。

select /*+  parallel(a,12) full(a) */  a.row_id, a.par_row_id, a.attrib_01,     a.created_by, a.last_upd_by from s_contact_xm a 
where a.type = 'Email' and (a.attrib_01 IS NULL
or a.attrib_01 like '% %'
or a.attrib_01 like '%@%@%'
or a.attrib_01 like '%..%'
or a.attrib_01 like '%;%'
or a.attrib_01 like '%:%'
or attrib_01 not like '%@%'
or a.attrib_01 like '%/%'
or a.attrib_01 like '%\%'
or a.attrib_01 like '%|%'
or a.attrib_01 like '%@.%'
or a.attrib_01 like '%@'
or a.attrib_01 like '%.'
or a.attrib_01 like '%(%'
or a.attrib_01 like '%)%'
or a.attrib_01 like '%<%'
or a.attrib_01 like '%>%'
or a.attrib_01 like '%#%'
or a.attrib_01 like '%"%'
or a.attrib_01 like '%.@%'
or a.attrib_01 like '%..%'
or a.attrib_01 like '.%'
or a.attrib_01 IS NULL
or INSTR(a.attrib_01, CHR(13)) > '0'
or INSTR(a.attrib_01, CHR(10)) > '0') and a.created_by = ‘1-XAAX5P’
4

2 に答える 2

0

電子メールの検証に関する多くのリンクが見つかります。これは、コピー/貼り付けのソリューションや、電子メールのすべてのケースをカバーすることを意図したものではなく、アプローチを示すだけです。

regexp_replace を使用して、英数字ではないもの、または追加の許容される文字 (@ や .) のリストではないものを探します。

これをルールに合わせて変更します。奇妙な文字または印刷できない文字を含む文字列のクリーンアップを示しています。

select regexp_replace('A^b\c@de' || chr(9) || 'f.com', '[^[:alnum:]@.]','') from dual;

Abc@def.com

更新ステートメントでは:

update my_table
set email = regexp_replace(email, '[^[:alnum:]@.]','');

完全な例 (11gr2):

SQL> create table t1
(
email varchar2(100)
)
Table created.
SQL> insert into t1 values ('a^bc@#.com')
1 row created.
SQL> insert into t1 values ('a\*bc' || chr(10) || '.net')
1 row created.
SQL> commit
Commit complete.
SQL> select * from t1

EMAIL                                                                          
--------------------------------------------------------------------------------
a^bc@#.com                                                                     
a\*bc                                                                          
.net                                                                           


2 rows selected.

SQL> update t1 set email = regexp_replace(email, '[^[:alnum:]@.]','')
2 rows updated.

SQL> commit
Commit complete.
SQL> select * from t1

EMAIL                                                                           
--------------------------------------------------------------------------------
abc@.com                                                                       
abc.net                                                                         

2 rows selected.

これは厳密な電子メールルールを強制するものではなく、受け入れられる文字の範囲外の文字を削除するだけであることに注意してください(OPが求めていたもの)。

于 2012-08-14T15:01:08.783 に答える
0

問題は、潜在的なエラーのカテゴリがいくつかあるということです。一部は修正可能なタイプミスです。一部は修正不可能なタイプミスです。そして、いくつかは間違っています。では、特定のエラーのカテゴリを決定するための防弾規則を考え出すことは可能でしょうか?

多分。

たとえば、出現するすべての「%..%」を「%.%」に変換できます。同様に、キャリッジ リターンを null に置き換えることもできます。これらは修正可能なタイプミスです。

しかし、誰かが"電子メール アドレスに を含めた場合、その人が実際に入力するつもりだったと確信する方法はあり2ません[shift]。これは修正可能なタイプミスではありません (ただし、推測で十分だと判断することもできます)。

電子メール アドレスに a が含まれていない場合、@それは有効な電子メール アドレスではなく、修正する方法はありません。

そのため、おそらくいくつかの個別の UPDATE ステートメントが必要になります。one を実行して、1 対 1 の置換を試みる文字列を翻訳します。これは、改行などの null に置き換えたいものに対するテクニックです。

translate(attrib_01, '()"'||chr(13), '902')

複数文字の文字列を変換するには、いくつかのパスが必要です。

replace(attrib_01, '..', '.')  

次に、おそらく先頭または末尾のドットをトリミングする必要があります

trim(both '.' from attrib_01 ) 

最後に、シュトルーデルがない (またはいくつかの) 値など、修正できないすべてのアドレスについてレポートする必要があります。

REGEXP_REPLACEを使用して、これらのルールの一部をより少ないステップに圧縮できる場合があります。正規表現は非常に複雑になります。古い skool Oracle の置換関数を使用すると、問題を修正するのが簡単になります。本当にパフォーマンスが必要な場合にのみ正規表現を使用することをお勧めします。それでも、データを複数回通過させる必要があります。


"'()"' は null と括弧を意味しますか? "

Oracle のドキュメントは、包括的で無料のオンラインです。REPLACE()についてすべて読むことができます。そこにTRANSLATE()TRIM()があります。

しかし、REPLACE() 呼び出しについてはもう少し説明します。この関数は、最初の文字列の各文字を 2 番目の文字列の一致する文字に置き換えます。一致しない文字は破棄されます。したがって、 は(に置き換えられ9)は に置き換えられ0"は に置き換えられ2ます。(理由を理解するには、QWERTY キーボードを見てください)。 chr(13)(改行) は一致しないため、破棄されます (または、そのように考えたい場合は NULL に置き換えられます)。


考えてみると、UPDATE set 句に CASE ステートメントを展開して、1 回の実行で異なる REPLACE()、TRIM()、および TRANSLATE() 呼び出しを適用できます。それは、コードをどれだけ侵入できないようにするかによって異なります:)

于 2012-08-14T15:25:36.407 に答える