7

私は db2 でデータベースを作成しています。ユーザーが %@%.% を含む有効な電子メール アドレスを挿入しているかどうかを検証する制約を追加したいと考えています。運がなければ...何かアドバイスはありますか?

4

3 に答える 3

14

ワイルドカードで LIKE を使用できます。DB2 のワイルドカードについては、こちらを参照してください。

下線文字 ( _ ) は、任意の 1 文字を表します。

パーセント記号 (%) は、0 個以上の文字列を表します。

SELECT email 
FROM YourTable 
WHERE email NOT LIKE '%_@__%.__%'

これは、次のケースを無視します (有効な電子メールの単純なバージョン):

  • @ の前に少なくとも 1 文字ある電子メール。
  • @ と . の間に少なくとも 2 文字ある電子メール。
  • の間に 2 文字以上ある電子メール。そして終わり。

sqlfiddleの MySql で例を見ることができます。

それを制約として追加するには、次のようにします(mustaccioがコメントで述べたように):

alter table your_table add constraint chk_email check (email like '%_@__%.__%')
于 2013-10-03T09:12:41.223 に答える
0

電子メールの構造を記述する正規表現を使用して、指定された文字列をチェックするトリガーを作成できます。

^[A-Za-z0-9]+@[A-Za-z0-9]+.[A-Za-z0-9]+$

ただし、電子メールの正規表現を定義するのは簡単ではありません。正規表現を使用して電子メール アドレスを検証する

DECLARE RET VARCHAR(32);
SET RET = XMLCAST (
    XMLQUERY ('fn:matches($TEXT,"^[A-Za-z0-9]+@[A-Za-z0-9]+.[A-Za-z0-9]+$")' 
    PASSING TEXT AS "TEXT"
    ) AS VARCHAR(32));

RET (true または false) の値を取得したら、トリガーで何かを実行できます。

コマンド ラインから使用する正規表現をテストできます。

db2 "xquery fn:matches(\"johndoe@mail.com\",\"^[A-Za-z0-9]+@[A-Za-z0-9]+.[A-Za-z0-9]+$\")"
于 2013-10-03T09:09:06.070 に答える