Разделение элементов строки по нескольким столбцам

#mysql

#mysql

Вопрос:

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

 North American Birds 53(1) 1999: 27-29
  

будет разделен на «Североамериканские птицы’, 53, 1, 1999, 27-19. Я знаю, что могу сделать кое-что из этого с помощью substring_index , но это не сработает для разделения названия журнала (North American Birds) из тома (53). Есть идеи, как я могу это сделать?

Ответ №1:

Вы можете использовать число в качестве разделителя.

Медленный и уродливый код, но я думаю, это работает

 SELECT 
  s.id
  ,SUBSTRING(s.title,1, PosOfFirstNumber-1) as booktitle
  ,SUBSTRING(s.title, PosOfFirstNumber) as Remainder
FROM 
  (SELECT
      id
      ,title
      ,LEAST(
          IFNULL(NULLIF(LOCATE('1',title),0),999)
          ,IFNULL(NULLIF(LOCATE('2',title),0),999)
          ,IFNULL(NULLIF(LOCATE('3',title),0),999)
          ,IFNULL(NULLIF(LOCATE('4',title),0),999)
          ,IFNULL(NULLIF(LOCATE('5',title),0),999)
          ,IFNULL(NULLIF(LOCATE('6',title),0),999)
          ,IFNULL(NULLIF(LOCATE('7',title),0),999)
          ,IFNULL(NULLIF(LOCATE('8',title),0),999)
          ,IFNULL(NULLIF(LOCATE('9',title),0),999)
          ,IFNULL(NULLIF(LOCATE('0',title),0),999)
        )) as PosOfFirstNumber
    FROM table1 ) s
  

Ответ №2:

Первый вопрос, который нужно задать: планируете ли вы разделить вашу строку на разные столбцы до ИЛИ после ее вставки в вашу базу данных? Я предлагаю разделить перед вставкой, но это предложение может быть слишком запоздалым.

При разделении ПЕРЕД вставкой вам следует использовать регулярные выражения для анализа ваших данных, а затем создать соответствующую вставку SQL. Вот пример регулярных выражений Java.

При разделении данных после того, как они уже находятся в вашей базе данных, вам нужно будет создать SQL с шаблоном, соответствующим строке ваших данных. Вот статья IBM, описывающая различные стратегии кода SQL.

Комментарии:

1. Данные уже находятся в базе данных, поэтому я рассмотрю второй вариант. Эта ссылка кажется довольно интересной. Спасибо.