次の点についてアドバイスをいただければ幸いです-OracleのSQLのある種のチェック制約を使用して、電子メールと郵便番号のフィールドを検証することは可能ですか?または、正規表現を使用したpl / sqlが疑われるこの種のことですか?
ありがとう
次の点についてアドバイスをいただければ幸いです-OracleのSQLのある種のチェック制約を使用して、電子メールと郵便番号のフィールドを検証することは可能ですか?または、正規表現を使用したpl / sqlが疑われるこの種のことですか?
ありがとう
引用符を含むメールアドレスの正規表現構文は次のとおりです
'[a-zA-Z0-9._%-]+@[a-zA-Z0-9._%-]+\.[a-zA-Z]{2,4}'
したがって、where句でregexp_like()を使用するか、regexp_substr()を使用して、フィールドに有効な電子メールアドレスが含まれているかどうかを確認できます。次に例を示します。regexp_substr()が.domainが欠落しているアドレスでNULLを返し、サブストリングの検証に失敗することがわかります。そこから、その周りにチェック制約を構築したり、trigger(yuck)などを使用して強制したりできます。
SQL> desc email
Name Null? Type
----------------------------------------- -------- ----------------------------
EMAIL_ID NUMBER
EMAIL_ADDRESS VARCHAR2(128)
SQL> select * from email;
EMAIL_ID EMAIL_ADDRESS
---------- ----------------------------------------
1 NEIL@GMAIL.COM
2 JOE@UTAH.GOV
3 lower_name@lower.org
4 bad_address@missing_domaindotorg
SQL> @qry2
SQL> column email_address format a40
SQL> column substr_result format a30
SQL> SELECT email_address
2 , regexp_substr(email_address,'[a-zA-Z0-9._%-]+@[a-zA-Z0-9._%-]+\.[a-zA-Z]{2,4}') substr_result
3 FROM email
4 /
EMAIL_ADDRESS SUBSTR_RESULT
---------------------------------------- ------------------------------
NEIL@GMAIL.COM NEIL@GMAIL.COM
JOE@UTAH.GOV JOE@UTAH.GOV
lower_name@lower.org lower_name@lower.org
bad_address@missing_domaindotorg
同じデータを使用して、REGEXP_LIKEを使用して有効な電子メールアドレスのみを制限するクエリを次に示します。
SQL> column email_address format a40
SQL> column substr_result format a30
SQL> SELECT email_address
2 FROM email
3 WHERE REGEXP_LIKE (email_address, '[a-zA-Z0-9._%-]+@[a-zA-Z0-9._%-]+\.[a-zA-Z]{2,4}');
EMAIL_ADDRESS
----------------------------------------
NEIL@GMAIL.COM
JOE@UTAH.GOV
lower_name@lower.org
SQLリファレンスの目次ページでregexpを検索して、正規表現のサポートを確認してください。
さらに優れた正規表現は次のとおりです。
^[a-zA-Z0-9._%-]+@[a-zA-Z0-9._%-]+\.[a-zA-Z]{2,4}$
^
(同じ式が与えられていますが、行の開始( )と終了( )に固定されてい$
ます)
アンカーがないと、「test1@hotmail.com some other text」のような式が検証され、1つの電子メールを検証しようとしている場合、上記の文字列は検証されません。
注:先頭または末尾のスペースが検証を台無しにしないように、電子メールは事前にトリミングする必要があります。
それが役に立てば幸い、
文字に注意してください'.'
。これはジョーカーです(SQL構文のよう*
に%
)。あなたはそれを。で置き換える必要があります'\'
。
これがRFC2822と一致させるために使用する正規表現です(おそらくすべての場合ではありません:)):
'^[a-zA-Z0-9!#$%''\*\+-/=\?^_`\{|\}~]+@[a-zA-Z0-9._%-]+\.[a-zA-Z]{2,4}$'
米国のみに関心がある場合は、フラットファイル形式で取得してテーブルにインポートし、アドレスの外部キー制約をそのテーブルに適用できる郵便番号のソースがいくつかあります。
電子メールアドレスを正規表現(10g以上が必要)と照合して形式を検証できますが、実際のアドレスであるかどうかを確認することは、はるかに困難な作業です。
他の人が述べているように、正規表現を使用して電子メールを検証できますが、精度は限られています。Real Emailのようなサービスを使用して、電子メールを検証する方がよい場合があります。このサービスは、電子メールが正しいかどうかだけでなく、ドメインとアカウントが有効かどうかをチェックします。
データをcsvとしてエクスポートしてから、検証することができます。詳細については、SQLデータベースで電子メールを検証する方法を参照してください。
declare
-- where customer is the table in my case
email_input customer.email%type;
begin
email_input:=:EMAIL;
IF email_input is not null
AND email_input not like '%@%.COM' then
message('Please enter a valid email address!');
message(' ');
clear_message;
:EMAIL:=null;
raise form_trigger_failure;
end if;
end;