2014-03-28 23 views
-1

解析希望有人能幫助我與MySQL查詢更新列從當前列數據

這是我有:

與包含這樣的數據的列「則將networkname」我表:

「VLAN-338-Network1-A,VLAN-364-Network2-A,VLAN-988-Network3-A,VLAN-1051-Network4-A」 

我需要一個MySQL查詢,將更新該列只有vlan數字以升序排除其他所有內容。即。

「338, 364, 988, 1051」

謝謝, 大衛

+0

是否所有的值有要提取四個值? –

+0

不,他們可以變化,只有一個,多達30個或更多。 – user2934368

+0

沒有簡單的方法來做到這一點。你可以把它看作是存儲字符串中的事物列表的懲罰,而不是具有更規範化的格式。 –

回答

0

在此腳本中,我通過則將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