在此腳本中,我通過則將networkname值創建循環的過程,並解析出號碼到一個單獨的表,然後使用group_concat
功能更新YourTable。這假設您的網絡名稱值遵循您的示例中的「VLAN-XXX」模式,其中「XXX」是要提取的3-4位數字。這也假設每個記錄都有唯一的ID。
CREATE PROCEDURE networkname_parser()
BEGIN
-- load test data
drop table if exists YourTable;
create table YourTable
(
ID int not null auto_increment,
networkname nvarchar(100),
primary key (ID)
);
insert into YourTable(networkname) values
('VLAN-338-Network1-A,VLAN-364-Network2-A,VLAN-988-Network3-A,VLAN-1051-Network4-A'),
('VLAN-231-Network1-A,VLAN-4567-Network2-A'),
('VLAN-9876-Network1-A,VLAN-321-Network2-A,VLAN-1678-Network3-A');
-- add commas to the end of networkname for parsing
update YourTable set networkname = concat(networkname,',');
-- parse networkname into related table
drop table if exists ParseYourString;
create table ParseYourString(ID int,NetworkNumbers int);
while (select count(*) from YourTable where networkname like 'VLAN-%') > 0
do
insert into ParseYourString
select ID,replace(substr(networkname,6,4),'-','')
from YourTable
where networkname like 'VLAN-%';
update YourTable
set networkname = right(networkname,char_length(networkname)-instr(networkname,','))
where networkname like 'VLAN-%';
end while;
-- update YourTable.networkname with NetworkNumbers
update YourTable t
inner join (select ID,group_concat(networknumbers order by networknumbers asc) as networknumbers
from ParseYourString
group by ID) n
on n.ID = t.ID
set t.networkname = n.networknumbers;
END//
調用程序和選擇的結果:
call networkname_parser();
select * from YourTable;
SQL小提琴:http://www.sqlfiddle.com/#!2/01c77/1
是否所有的值有要提取四個值? –
不,他們可以變化,只有一個,多達30個或更多。 – user2934368
沒有簡單的方法來做到這一點。你可以把它看作是存儲字符串中的事物列表的懲罰,而不是具有更規範化的格式。 –