2012-01-05 78 views
4

我已經繼承了一個數據庫,並且在努力使其更清潔和更有用時,我遇到了以下問題。在SQL中將字符串拆分成多個行

將文件列移動到單獨的表後,我現在的任務是將這些文件分成不同的行。請看下面的例子。

key | jobid  | files     | 
-------------------------------------------- 
1  30012  file1.pdf;file2.pdf 
2  30013  file3.pdf 
3  30014  file4.pdf;file5.pdf;file6.pdf 

我想一個SQL語句,這將使該表爲以下:

key | jobid  | files     | 
-------------------------------------------- 
1  30012  file1.pdf 
2  30013  file3.pdf 
3  30014  file4.pdf 
4  30012  file2.pdf 
5  30014  file5.pdf 
6  30014  file6.pdf 

它不事關如果原來entrys必須刪除實現這一點,所以下面的解決方案也將是可以接受:

key | jobid  | files     | 
-------------------------------------------- 
4  30012  file1.pdf 
5  30013  file3.pdf 
6  30014  file4.pdf 
7  30012  file2.pdf 
8  30014  file5.pdf 
9  30014  file6.pdf 

基本上我只是需要把文件字符串分開;分隔符和用分割字符串創建的新行。

任何幫助,您可以提供將不勝感激。

+0

我明白這是一份單一的工作 - 對嗎? – 2012-01-05 12:00:53

+0

可能重複的[Mysql string split](http://stackoverflow.com/questions/6152137/mysql-string-split) – 2012-01-05 12:01:07

+1

是Eugen它的一次性工作。 – user1132038 2012-01-05 12:06:32

回答

0

在PHP(假設$ DB是一個有效的數據庫連接和key爲AUTO_INCREMENT):

$sql="select `key`, jobid, files from filestable where files like '%\\;%'"; 
$qry=mysql_query($sql,$db); 

$sql=array(); 
while (true) { 
    $row=mysql_fetch_row($qry); 
    if (!$row) break; 

    $key=$row[0]; 
    $jobid=$row[1]; 
    $files=explode(';',$row[2]); 
    foreach ($files as $file) { 
    $file=mysql_real_escape_string($file,$db); 
    $sql[]="insert into filestable (jobid,files) values ($jobid,'$file')"; 
    } 
    $sql[]="delete from filestables where `key`=$key"; 
} 

現在$ sql中有SQL語句的排列運行 - 無論是在while循環結束運行它們,或者將它們批處理,然後寫出來,無論哪種方式適合你的加載模式。

+0

除了向SQL語句添加通配符並添加一個「到插入行,這工作完美。非常感謝! – user1132038 2012-01-05 12:45:48

+0

良好的捕獲,我糾正缺少的報價和通配符,對不起,這是一個壞的情況」思考第n行+1,同時輸入n行「 – 2012-01-05 12:48:31

+0

問題是如何在SQL中完成它。 – reinierpost 2018-03-06 19:43:15