如何编写查询以确保电子邮件包含@

时间:2013-10-03 08:34:09

标签: sql db2 check-constraints

我正在db2中创建一个数据库,我想添加一个约束来验证用户是否插入了一个包含%@%。%的有效电子邮件地址。没有运气......有什么建议吗?

3 个答案:

答案 0 :(得分:9)

您可以将LIKE与通配符一起使用。有关DB2的通配符,请参阅here

  

下划线字符(_)代表任何单个字符。

     

百分号字符(%)表示零个或多个字符的字符串。

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

这将忽略以下情况(有效电子邮件的简单版本):

  • 在@;
  • 之前至少有一个字符的电子邮件
  • @和。之间至少有两个字符的电子邮件;
  • 两者之间至少有两个字符的电子邮件。结束。

您可以在sqlfiddle中的MySql中看到一个示例。

要将其添加为约束,您可以(正如mustaccio在评论中所说):

alter table your_table add constraint chk_email check (email like '%_@__%.__%')

答案 1 :(得分:0)

您可以创建一个触发器,使用描述电子邮件结构的正则表达式检查给定字符串

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

但是,电子邮件的正则表达式不容易定义:Using a regular expression to validate an email address

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的值(真或假),你就可以在触发器中做一些事情。

您可以从命令行测试要使用的正则表达式:

db2 "xquery fn:matches(\"johndoe@mail.com\",\"^[A-Za-z0-9]+@[A-Za-z0-9]+.[A-Za-z0-9]+$\")"

答案 2 :(得分:0)

仅确保@并不是验证电子邮件地址的理想选择。

验证可以类似于

SELECT Email FROM YourTable WHERE email NOT REGEXP_LIKE(Email, '^[a-zA-Z0-9][a-zA-Z0-9._-]*@[a-zA-Z0-9][a-zA-Z0-9._-]*\\.[a-zA-Z]{2,4}$')

或者您甚至可以执行更简单的验证来减少误报并提高运行速度

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