2016-10-07 8 views
0

少なくとも10個以上の電子メールを連続して格納する電子メール列があります。ここでは、各メールを別々の行に配置するクエリを作成したいと考えています。例:Sqlの区切りフィールド内の改行またはキャリッジリターン

[email protected] 
    [email protected] 
    live.gmail.com 

どのように記述しますか?

+1

を必要に応じて、これは非常に悪いデザインです。まず、電子メールを別のテーブルにして、各電子メールを個々の行に入れて修正する必要があります。 – HLGEM

+0

私は@HLGEM、悪いデータベースデザインに同意します。しかし、これはあなたの状況に役立ちますhttp://stackoverflow.com/questions/7595826/sql-server-table-result-to-array-in-sql-server-2005 – tale852150

答えて

1

使用Replace()

select replace(MyEmailField, '<CurrentDelimeter>', char(13)) as NewEmail 
from MyTable 
2

あなたはデータの行を意味する場合は、(REPLACEそれ以外の場合は2016を持っていない場合JohnHCは

Declare @YourTable table (ID int,Emails varchar(max)) 
Insert Into @YourTable values 
(1,'[email protected],[email protected],live.gmail.com') 

Select A.ID 
     ,EMail=B.RetVal 
From @YourTable A 
Cross Apply [dbo].[udf-Str-Parse](A.EMails,',') B 
を述べたように...どれパース/スプリット機能)が行います

返し

ID EMail 
1 [email protected] 
1 [email protected] 
1 live.gmail.com 

または単に

Select * from [dbo].[udf-Str-Parse]('[email protected],[email protected],live.gmail.com',',') 

戻り

RetSeq RetVal 
1  [email protected] 
2  [email protected] 
3  live.gmail.com 

機能

CREATE FUNCTION [dbo].[udf-Str-Parse] (@String varchar(max),@Delimiter varchar(10)) 
Returns Table 
As 
Return ( 
    Select RetSeq = Row_Number() over (Order By (Select null)) 
      ,RetVal = LTrim(RTrim(B.i.value('(./text())[1]', 'varchar(max)'))) 
    From (Select x = Cast('<x>'+ Replace(@String,@Delimiter,'</x><x>')+'</x>' as xml).query('.')) as A 
    Cross Apply x.nodes('x') AS B(i) 
); 
--Select * from [dbo].[udf-Str-Parse]('Dog,Cat,House,Car',',') 
--Select * from [dbo].[udf-Str-Parse]('John Cappelletti was here',' ') 
関連する問題