使用sql获取邮件ID之间的名称

时间:2011-11-04 11:40:31

标签: sql sql-server sql-server-2008

我正在使用SQL服务器。我有一个行值为

  

cc:x@gmail.com cc:y@gmail.com james cc:q@gmail.com

在上面我必须得到值“ james ”作为输出。

replace(column_name,substring(column_name, CHARINDEX('cc:',column_name), CHARINDEX('.com',column_name)+4),'')

使用上面的内容,我删除了cc:x@gmail.com的第一次出现,现在我必须删除cc:..@gmail.com

的下两次出现

提前致谢

4 个答案:

答案 0 :(得分:2)

declare @txt varchar(1000) ='cc:x@gmail.com cc:y@gmail.com james cc:q@gmail.com'

;with split as
(
select 1 f, charindex(' ', @txt+ ' ', 2) t
union all
select t+1, charindex(' ', @txt+ ' ', t+1)
from split
where charindex(' ', @txt+ ' ', t+1) > f
)
select substring(@txt, f, t-f) from split
where not substring(@txt, f, t-f) like '%@%'

结果:

james

编辑:

我更改了sql以满足您的确切要求:

create function f_returnnames(@txt varchar(1000))
returns varchar(1000)
 as
begin
declare @returntext varchar(1000)

;with split as
(
select 1 f, charindex(' ', @txt+ ' ', 2) t
union all
select t+1, charindex(' ', @txt+ ' ', t+1)
from split
where charindex(' ', @txt+ ' ', t+1) > f
)
select @returntext = coalesce(@returntext + ' ', '')  + substring(@txt, f, t-f) from split
where not substring(@txt, f, t-f) like '%@%'

return @returntext
end

go

你可以在这里测试一下:

select (select dbo.f_returnnames(column_name)) names
from 
(select 'cc:x@gmail.com cc:y@gmail.com james cc:q@gmail.com' column_name) a

答案 1 :(得分:0)

SELECT name
FROM Persons
where emailid='cc:address@example.com'

答案 2 :(得分:0)

编辑:它只适用于.com邮件地址。

你必须做多个REPLACE。使用WHILE循环来检测是否有cc:要删除。这是完整的标量函数代码:

CREATE FUNCTION FN_STRIPCC(@COLUMN_NAME NVARCHAR(200))
RETURNS NVARCHAR(200)
AS
BEGIN
    WHILE (CHARINDEX('cc:', @COLUMN_NAME) > 0 )
    BEGIN
        SET @COLUMN_NAME =  replace(@column_name,substring(@column_name, CHARINDEX('cc:',@column_name), CHARINDEX('.com',@column_name)+4),'')
    END
    RETURN @COLUMN_NAME
END

然后你可以使用它:

SELECT dbo.FN_STRIPCC('cc:x@gmail.com cc:y@gmail.com james cc:q@gmail.com')

答案 3 :(得分:0)

我可以假设您想要的是非电子邮件地址吗?让我们说“我想在空格分隔的字符串列表中提取第一个字符串,这些字符串看起来不像电子邮件地址”,其中“看起来像电子邮件地址”被解释为“包含@”。那够近吗?

create function get_me_that_james(@v nvarchar(max)) returns nvarchar(max) as
begin
    declare @email nvarchar(max),  @pos int;

    set @pos = 0;
    select @email = substring(@v, @pos, charindex(' ', @v, @pos) - @pos)
    while(charindex('@', @email) != 0) begin
        set @pos = charindex(' ', @v, @pos) + 1;
        select @email = substring(@v, @pos, charindex(' ', @v, @pos) - @pos);
    end
    return @email;
end

然后叫它

select dbo.get_me_that_james('cc:x@gmail.com cc:y@gmail.com james cc:q@gmail.com');