0

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

-- cdu_mail is the column

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

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

在此处输入图像描述

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

谢谢你。

4

4 回答 4

3

您还可以在列末尾添加分号以保证分号始终存在,并避免使用 case 表达式:

select     ltrim(rtrim(cdu_mail)),     
    substring(ltrim(RTRIM(cdu_mail)), 0, charindex(';',ltrim(RTRIM(cdu_mail + ';')))) 
FROM #Clientes 
于 2012-09-04T14:15:24.680 回答
1

您可以将其放入 case 语句中:

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
于 2012-09-04T14:12:37.817 回答
1
    select  case when charindex(';', cdu_mail) = 0 then cdu_mail else
                    substring(cdu_mail,1, charindex(';', cdu_mail) - 1) end
    from    clientes
于 2012-09-04T14:14:51.457 回答
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 值。

高温高压

于 2012-09-04T14:26:06.230 回答