早上好, 我在表格中有一个电子邮件列,其中包含在某些行中多个电子邮件,以分号分隔。 实际上我正在尝试使用此查询检索电子邮件
-- cdu_mail is the column
select
ltrim(rtrim(cdu_mail)),
substring(ltrim(RTRIM(cdu_mail)), 0, charindex(';',ltrim(RTRIM(cdu_mail))))
FROM Clientes
如果我在行中有多个邮件,则查询会正确检索第一封电子邮件,但如果该行中只有一封电子邮件,则结果为空。
我需要更改什么才能正确收到所有邮件?
谢谢。
答案 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