2013-11-12 3 views
0
declare @T table (id int, fname varchar(50), tname varchar(50), email varchar(200)) 

insert into @T values (1, 'fname1', 'tname1', '[email protected] xxx.xxxxx.com') 
insert into @T values (2, 'fname2', 'tname2', 'just a bunch of usless data') 
insert into @T values (3, 'fname3', 'tname3', '[email protected]') 
insert into @T values (4, 'fname4', 'tname4', '[email protected] [email protected]') 
insert into @T values (5, 'fname5', 'tname5', '[email protected] xxxx.msn.com') 
insert into @T values (3, 'fname6', 'tname6', '[email protected]') 

У меня есть таблица с данными, как показано выше, некоторые хорошие электронные письма некоторые плохие ..Избирательно Извлечение писем из столбцов

мне нужно выбрать эти данные в новую временную таблицу, что я буду genereate письма от , Мне нужно создать одну строку для каждого допустимого адреса электронной почты, поэтому я бы дублировал имя fname, tname, email для каждого действительного адреса электронной почты. Я не возражаю, если я получаю строку с плохим адресом электронной почты, пока я получаю строку для каждого действительного.

Может ли кто-нибудь помочь в выборе этого запроса?

Я был бы признателен. Благодаря

+0

SQL-Server 2008 не предоставляет встроенную функцию разделения строки, так что вам нужны пользовательские функции, как это: http://stackoverflow.com/a/ 10914602/2947592 – wvdz

ответ

3

Во-первых, создать простую функцию строки расщепления:

CREATE FUNCTION [dbo].[SplitString] 
    (
     @List NVARCHAR(MAX), 
     @Delim VARCHAR(255) 
    ) 
    RETURNS TABLE 
    AS 
     RETURN (SELECT [Value] FROM 
      ( 
      SELECT 
       [Value] = LTRIM(RTRIM(SUBSTRING(@List, [Number], 
       CHARINDEX(@Delim, @List + @Delim, [Number]) - [Number]))) 
      FROM (SELECT Number = ROW_NUMBER() OVER (ORDER BY name) 
       FROM sys.all_objects) AS x 
       WHERE Number <= LEN(@List) 
       AND SUBSTRING(@Delim + @List, [Number], LEN(@Delim)) = @Delim 
     ) AS y 
     ); 

Затем, вы можете использовать его в OUTER APPLY:

declare @T table (id int, fname varchar(50), tname varchar(50), email varchar(200)) 

insert into @T values (1, 'fname1', 'tname1', '[email protected] xxx.xxxxx.com') 
insert into @T values (2, 'fname2', 'tname2', 'just a bunch of usless data') 
insert into @T values (3, 'fname3', 'tname3', '[email protected]') 
insert into @T values (4, 'fname4', 'tname4', '[email protected] [email protected]') 
insert into @T values (5, 'fname5', 'tname5', '[email protected] xxxx.msn.com') 
insert into @T values (3, 'fname6', 'tname6', '[email protected]') 

SELECT t.id, t.fname, t.tname, f.Value 
    FROM @T AS t 
    OUTER APPLY dbo.SplitString(REPLACE(t.email, ' ', ';'), ';') AS f 
    WHERE t.email LIKE '%@%' AND f.Value LIKE '%@%'; 

Результаты:

id fname  tname  Value 
---- ------ ------ -------------- 
1 fname1 tname1 [email protected] 
3 fname3 tname3 [email protected] 
4 fname4 tname4 [email protected] 
4 fname4 tname4 [email protected] 
5 fname5 tname5 [email protected] 
3 fname6 tname6 [email protected] 

Больше на (и лучшие альтернативы, если расщепляющие строки, исходящие от t он прикладной уровень):

http://www.sqlperformance.com/2012/07/t-sql-queries/split-strings

http://www.sqlperformance.com/2012/08/t-sql-queries/splitting-strings-now-with-less-t-sql

Смежные вопросы