【问题标题】:How to write a query to ensure email contains @如何编写查询以确保电子邮件包含 @
【发布时间】:2013-10-03 08:34:09
【问题描述】:

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

【问题讨论】:

    标签: sql db2 check-constraints


    【解决方案1】:

    您可以将 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 '%_@__%.__%')
    

    【讨论】:

    • 这适用于 DB2,我可以确认。要将检查约束添加到现有列,请使用 alter table your_table add constraint chk_email check (email like '%_@__%.__%')
    • 你的方法完全没有问题,我只是想表明我已经尝试了两种方法。另一件事我认为实际上可以接受两个答案。
    【解决方案2】:

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

    ^[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]+$\")"
    

    【讨论】:

      【解决方案3】:

      确保仅 @ 不是验证电子邮件地址的理想检查。

      验证可以是这样的

      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 '%_@__%.__%'
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2015-12-27
        • 2011-04-10
        • 2010-10-16
        • 2021-06-17
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多