从SQL行中的字符串中检索第一封电子邮件

时间:2012-09-04 14:10:02

标签: sql string

早上好, 我在表格中有一个电子邮件列,其中包含在某些行中多个电子邮件,以分号分隔。 实际上我正在尝试使用此查询检索电子邮件

-- cdu_mail is the column

select
    ltrim(rtrim(cdu_mail)),
    substring(ltrim(RTRIM(cdu_mail)), 0, charindex(';',ltrim(RTRIM(cdu_mail)))) 
FROM Clientes

如果我在行中有多个邮件,则查询会正确检索第一封电子邮件,但如果该行中只有一封电子邮件,则结果为空。

enter image description here

我需要更改什么才能正确收到所有邮件?

谢谢。

4 个答案:

答案 0 :(得分:3)

您还可以在列的末尾添加分号以确保始终存在分号,并避免使用大小写表达式:

select     ltrim(rtrim(cdu_mail)),     
    substring(ltrim(RTRIM(cdu_mail)), 0, charindex(';',ltrim(RTRIM(cdu_mail + ';')))) 
FROM #Clientes 

答案 1 :(得分:1)

您可以将其放入案例陈述中:

select (case when cdu_email like '%;'
             then ltrim(rtrim(cdu_mail)), substring(ltrim(RTRIM(cdu_mail)), 0,
                                                    charindex(';',ltrim(RTRIM(cdu_mail))))
             else cdu_email
        end) as firstEmail
from Clientes

问题是一封电子邮件不以';'结尾,因此charindex()返回0.

我意识到,你也可以通过为特定搜索附加分号来解决这个问题:

select ltrim(rtrim(cdu_mail)), substring(ltrim(RTRIM(cdu_mail)), 0,
                                         charindex(';',ltrim(RTRIM(cdu_mail+';'))))
from Clientes

答案 2 :(得分:1)

    select  case when charindex(';', cdu_mail) = 0 then cdu_mail else
                    substring(cdu_mail,1, charindex(';', cdu_mail) - 1) end
    from    clientes

答案 3 :(得分:0)

我不知道您使用的是什么版本的SQL语法,但在MySQL中,您可以执行以下操作:

SELECT 
    IF( LOCATE(  ";", TRIM( cdu_mail ) ) >1, LEFT( TRIM( cdu_mail ), 
    LOCATE(  ";", TRIM( cdu_mail ) ) -1 ), 
    TRIM( cdu_mail ) ) AS email
FROM Clientes

如果有“;”,请选择第一封电子邮件,否则只需获取该字段的值(因为只有一封电子邮件)。

您可能还想使用WHERE子句引入NULL值检查。

HTH