Разбить строку на несколько строк в SQL - PullRequest
4 голосов
/ 05 января 2012

Я унаследовал базу данных, и, пытаясь сделать ее более чистой и полезной, я столкнулся со следующей проблемой.

После перемещения столбца файлов в отдельную таблицу у меня появилась задача разделить эти файлы на разные строки. Пожалуйста, смотрите мой пример ниже.

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

Не имеет значения, должны ли исходные записи быть удалены для достижения этой цели, поэтому будет также приемлемо следующее решение:

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

По сути, мне просто нужно разделить строку файлов на; разделитель и новая строка, созданная с помощью разделенных строк.

Буду признателен за любую помощь, которую вы можете оказать.

Ответы [ 2 ]

0 голосов
/ 14 февраля 2019

У меня точно такой же вопрос, нашел статью, которая может помочь, они предоставили скрипт MySQL

create table books (tags varchar(1000));

insert into books values
    ('A, B, C, D'),
    ('D, E'),
    ('F'),
    ('G, G, H')
;

select
  TRIM(SUBSTRING_INDEX(SUBSTRING_INDEX(B.tags, ',', NS.n), ',', -1)) as tag
from (
  select 1 as n union all
  select 2 union all
  select 3 union all
  select 4 union all
  select 5 union all
  select 6 union all
  select 7 union all
  select 8 union all
  select 9 union all
  select 10
) NS
inner join books B ON NS.n <= CHAR_LENGTH(B.tags) - CHAR_LENGTH(REPLACE(B.tags, ',', '')) + 1

Я добавил ключевое слово на игровую площадку здесь
https://www.db -fiddle.com / ж / kLeLYVPmuoFtLEuAb8ihuE / 0

Ссылка:
https://www.holistics.io/blog/splitting-array-string-into-rows-in-amazon-redshift-or-mysql/

0 голосов
/ 05 января 2012

В 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, либо сгруппируйте их, запишите их на потом, в зависимости от вашей схемы загрузки.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...