6

次の点についてアドバイスをいただければ幸いです-OracleのSQLのある種のチェック制約を使用して、電子メールと郵便番号のフィールドを検証することは可能ですか?または、正規表現を使用したpl / sqlが疑われるこの種のことですか?

ありがとう

4

6 に答える 6

7

引用符を含むメールアドレスの正規表現構文は次のとおりです

'[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を検索して、正規表現のサポートを確認してください。

于 2009-04-25T13:07:38.680 に答える
5

さらに優れた正規表現は次のとおりです。

^[a-zA-Z0-9._%-]+@[a-zA-Z0-9._%-]+\.[a-zA-Z]{2,4}$

^(同じ式が与えられていますが、行の開始( )と終了( )に固定されてい$ます)

アンカーがないと、「test1@hotmail.com some other text」のような式が検証され、1つの電子メールを検証しようとしている場合、上記の文字列は検証されません。

注:先頭または末尾のスペースが検証を台無しにしないように、電子メールは事前にトリミングする必要があります。

それが役に立てば幸い、

于 2011-09-19T11:20:35.843 に答える
2

文字に注意してください'.'。これはジョーカーです(SQL構文のよう*%)。あなたはそれを。で置き換える必要があります'\'

これがRFC2822と一致させるために使用する正規表現です(おそらくすべての場合ではありません:)):

'^[a-zA-Z0-9!#$%''\*\+-/=\?^_`\{|\}~]+@[a-zA-Z0-9._%-]+\.[a-zA-Z]{2,4}$'
于 2012-03-05T12:03:44.433 に答える
1

米国のみに関心がある場合は、フラットファイル形式で取得してテーブルにインポートし、アドレスの外部キー制約をそのテーブルに適用できる郵便番号のソースがいくつかあります。

電子メールアドレスを正規表現(10g以上が必要)と照合して形式を検証できますが、実際のアドレスであるかどうかを確認することは、はるかに困難な作業です。

于 2009-04-24T20:07:12.343 に答える
0

他の人が述べているように、正規表現を使用して電子メールを検証できますが、精度は限られています。Real Emailのようなサービスを使用して、電子メールを検証する方がよい場合があります。このサービスは、電子メールが正しいかどうかだけでなく、ドメインとアカウントが有効かどうかをチェックします。

データをcsvとしてエクスポートしてから、検証することができます。詳細については、SQLデータベースで電子メールを検証する方法を参照してください。

于 2020-09-20T03:42:59.933 に答える
-1
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;    
于 2017-01-23T22:51:40.683 に答える