2011-02-23 59 views
0
select id, ips from users; 

查詢結果如何擴展MySQL中的逗號分隔的字段爲多行

id ips 
1  1.2.3.4,5.6.7.8 
2  10.20.30.40 
3  111.222.111.222,11.22.33.44 
4  1.2.53.43 

我想運行產生以下輸出查詢

user_id  ip 
1   1.2.3.4 
1   5.6.7.8 
2   10.20.30.40 
3   111.222.111.222 
3   11.22.33.44 
4   1.2.53.43 
+0

我希望你喜歡用臨時表和存儲過程的工作。有些東西告訴我這個數據庫需要進行標準化 - 完全不同。 –

+0

如果可以的話,重新設計這部分的數據庫,使其規範化。從user_id到ip的1:n關係應該存儲在它自己的表中。 –

+0

@布拉德克里斯蒂,數據庫一般沒問題。這是我一直面臨的一次性正常化問題。 –

回答

1

我不認爲這是你想要使用的查詢做一些事情,但你寧願做你的表現邏輯。數據庫僅用於存儲和檢索數據。格式化數據並將其呈現在表現層中,通常與PHP/ASP.NET /其他相結合。

2

如果你不介意使用遊標,這裏有一個例子:


set nocount on; 
-- create sample table, @T 
declare @T table(id int, ips varchar(128)); 
insert @T values(1,'1.2.3.4,5.6.7.8') 
insert @T values(2,'10.20.30.40') 
insert @T values(3,'111.222.111.222,11.22.33.44') 
insert @T values(4,'1.2.53.43') 
insert @T values(5,'1.122.53.43,1.9.89.173,2.2.2.1') 

select * from @T 

-- create a table for the output, @U 
declare @U table(id int, ips varchar(128)); 

-- setup a cursor 
declare XC cursor fast_forward for select id, ips from @T 
declare @ID int, @IPS varchar(128); 

open XC 
fetch next from XC into @ID, @IPS 
while @@fetch_status = 0 
begin 
     -- split apart the ips, insert records into table @U 
     declare @ix int; 
     set @ix = 1; 
     while (charindex(',',@IPS)>0) 
     begin 
      insert Into @U select @ID, ltrim(rtrim(Substring(@IPS,1,Charindex(',',@IPS)-1))) 
      set @IPS = Substring(@IPS,Charindex(',',@IPS)+1,len(@IPS)) 
      set @ix = @ix + 1 
     end 
     insert Into @U select @ID, @IPS 

    fetch next from XC into @ID, @IPS 
end 

select * from @U 
相關問題