我正在使用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
提前致谢
答案 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');