получение имени между почтовыми идентификаторами с использованием sql - PullRequest
1 голос
/ 04 ноября 2011

Я использую 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 ]

2 голосов
/ 04 ноября 2011
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
0 голосов
/ 04 ноября 2011

РЕДАКТИРОВАТЬ: он будет работать только с почтовыми адресами .com.

Вы должны сделать несколько ЗАМЕН.Используйте цикл 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')
0 голосов
/ 04 ноября 2011

Могу ли я предположить, что вы всегда хотите не адрес электронной почты? Допустим, «я хочу извлечь первую строку из списка строк, разделенных пробелами, который не похож на адрес электронной почты», где «выглядеть как адрес электронной почты» интерпретируется как «содержит @». Это достаточно близко?

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');
0 голосов
/ 04 ноября 2011
SELECT name
FROM Persons
where emailid='cc:address@example.com'
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...