select id, ips from users;
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
select id, ips from users;
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
我不認爲這是你想要使用的查詢做一些事情,但你寧願做你的表現邏輯。數據庫僅用於存儲和檢索數據。格式化數據並將其呈現在表現層中,通常與PHP/ASP.NET /其他相結合。
如果你不介意使用遊標,這裏有一個例子:
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
我希望你喜歡用臨時表和存儲過程的工作。有些東西告訴我這個數據庫需要進行標準化 - 完全不同。 –
如果可以的話,重新設計這部分的數據庫,使其規範化。從user_id到ip的1:n關係應該存儲在它自己的表中。 –
@布拉德克里斯蒂,數據庫一般沒問題。這是我一直面臨的一次性正常化問題。 –