2012-01-05 227 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