【问题标题】:Parse email address in Oracle to count number of addresses with 3 or less chars before @ sign在 Oracle 中解析电子邮件地址以计算 @ 符号前 3 个或更少字符的地址数
【发布时间】:2011-03-12 11:04:04
【问题描述】:

我需要计算数据库中 @ 符号前有 3 个或更少字符的电子邮件地址的数量,例如 ab@test.com。

Oracle 中不存在 parsename 函数,我不确定如何为此编写正则表达式。任何帮助将不胜感激!

【问题讨论】:

    标签: sql regex oracle plsql


    【解决方案1】:

    你想要的正则表达式是:

    ^[^@]{0,3}@
    

    英文是:

    • 字符串开始
    • 0 到 3 个不属于 at 符号的事物。
    • at 符号。

    【讨论】:

    • 谢谢英文翻译+1
    【解决方案2】:

    您可以定义 WHERE 子句并使用 COUNT,或者直接跳过使用 REGEXP_COUNT:

    SELECT REGEXP_COUNT(t.email, '^[^@]{0,3}@', 1, 'i') RESULT
      FROM TABLE t;
    

    使用 COUNT:

    SELECT COUNT(*)
      FROM TABLE t
     WHERE REGEXP_LIKE(t.email, '^[^@]{0,3}@')
    

    参考:

    【讨论】:

    • 请注意 REGEXP 是 Oracle 10g+ -- 在此之前的 Oracle 版本中不支持正则表达式。
    【解决方案3】:

    正则表达式对此太过分了。你只需要

    instr(t.email, '@') < 5 AND instr(t.email, '@') > 0

    经过 cmets 的更正编辑。

    【讨论】:

    • 这可能比正则表达式快得多。
    • 这正是我最终自己弄清楚的,最终结果如下所示: SELECT count(*) from something where instr(email, '@', 1)
    • 我仍然认为你落后一分。对于 @ 符号前的 3 个字符的地址,您的表达式的结果是 4。
    • DCookie 是对的。 instr 为 joe@example.com 返回 4,因此测试应该是
    【解决方案4】:

    以下有一点问题 instr(t.email, '@')

    只要 t.email 有一个“@”,这个查询就可以工作!否则,它也会返回那些 t.email 没有'@'的条目

    【讨论】:

    • 你是对的,幸运的是,这不是问题,因为电子邮件格式在输入时会得到验证。只需要看看我们是否可以实施更强的验证。
    猜你喜欢
    • 2012-09-03
    • 2011-01-07
    • 2012-09-19
    • 1970-01-01
    • 2015-05-02
    • 1970-01-01
    • 2011-11-27
    • 1970-01-01
    • 2019-04-03
    相关资源
    最近更新 更多