2010-03-09 78 views
1

我对MySQL的REGEX支持的功能有点困惑,我还没有找到一个关于如何将结果与REGEX within an sql statement分开的可靠示例。通过REGEX在MySQL中解析结果

例子:

我怎么能拉离,看起来像一台电子邮件的数据...

+-------------------------+ 
|Emails     | 
|-------------------------| 
|[email protected]| 
+-------------------------+ 

,并返回经过,看起来像一个SQL语句的东西...

+------------------------------+ 
|Username | Domain | TLD | 
|-----------|------------|-----| 
|some.email | yourdomain | com | 
+------------------------------+ 
+0

这是使用MySQL脚本吗? – 2010-03-09 22:04:45

回答

8

MySQL没有内置的功能来执行你所要求的功能。通过定义一些新的函数是可能的,但只要用你通过访问数据库的任何编程语言来做就可能更容易。

对于作为电子邮件地址,这样简单的事情,虽然,你不应该需要在所有使用正则表达式,你可以使用SUBSTRING_INDEX() function,如:

SELECT 
    SUBSTRING_INDEX(email, '@', 1) AS Username, 
    SUBSTRING_INDEX(SUBSTR(email, LOCATE('@', email)), '.', 1) AS Domain, 
    SUBSTRING_INDEX(email, '.', -1) AS TLD 
FROM users; 

在的话,那就是:

  • 用户名=第一个'@'前的所有内容
  • Domain =第一个'@'和第一个'。'之间的所有内容。
  • TLD =上次'。'后的所有内容。
+0

嗯,中间子字符串没有返回任何东西... – 2010-03-09 22:21:46

+0

我的错误,“LOCATE()”的参数是向后的,我将编辑我的答案来修复它。 – 2010-03-09 22:30:28

+0

谢谢!我喜欢这样,这是一个非常简单的解决方案。 – 2010-03-10 14:57:15

0

您也可以尝试,

select substring_index(email, '@', 1) username 
     ,substring_index(substring_index(email, '@', -1), '.',1) domain 
     ,substring_index(email, '.', -1) tld 
from 
(select '[email protected]' email) E 

仅使用SUBSTRING_INDEX。第一个substring_index在'@'的左边,第三个(内部substring_index)在'@'的右边,然后由第二个子字符串解析得到域,最后一个将所有东西拉到'。'的右边。