MySql: конвертировать данные столбца в строку

0

У меня есть таблица в mysql, которая выглядит ниже.

id  cust_id date    data

1   1   1/1/2018    a b c d e f g

2   1   2/1/2018    h I j k l m n 

Здесь в этом примере столбец данных имеет огромные данные, разделенные пробелом вроде abcd, я хотел бы показать случай как в строке, как показано ниже

id  cust_id date    data

1   1   1/1/2018    a

1   1   1/1/2018    b

1   1   1/1/2018    c

1   1   1/1/2018    d

2   2   2/1/2018    h

2   2   2/1/2018    i

2   2   2/1/2018    j

2   2   2/1/2018    k

Я проверил несколько вариантов, как использование функции univot, но не смог достичь своего результата. Заранее спасибо !!

  • 0
    Вы действительно должны хранить данные в вашей базе данных во втором формате, а затем создавать первый формат, если / когда это необходимо, с помощью GROUP_CONCAT() . В сложившейся ситуации это непросто изменить только в MySQL - предложите написать небольшой ETL-скрипт, который сделает это за вас.
  • 0
    То есть данные всегда один символ + один пробел?
Показать ещё 2 комментария
Теги:
unpivot

1 ответ

0
Лучший ответ
select
  tablename.id,
  tablename.date
  ,SUBSTRING_INDEX(SUBSTRING_INDEX(tablename.data, ' ', numbers.n), ' ', -1) name
from
  (
    SELECT @row := @row + 1 as n FROM 
    (select 0 union all select 1 union all select 3 union all select 4 union all select 5 union all select 6 union all select 6 union all select 7 union all select 8 union all select 9) t,
    (select 0 union all select 1 union all select 3 union all select 4 union all select 5 union all select 6 union all select 6 union all select 7 union all select 8 union all select 9) t1,
    (select 0 union all select 1 union all select 3 union all select 4 union all select 5 union all select 6 union all select 6 union all select 7 union all select 8 union all select 9) t2,
    (SELECT @row:=0) r
  ) numbers INNER JOIN Table1 tablename
  on CHAR_LENGTH(tablename.data)
     -CHAR_LENGTH(REPLACE(tablename.data, ' ', ''))>=numbers.n-1
order by
  id, n

Проверить ссылку для вывода

http://sqlfiddle.com/#!9/fa0dcb/1

ОБЪЯСНЕНИЕ: сначала выполните внутренний запрос, т.е.

select 0 
union all 
select 1 
union all 
select 3 
union all 
select 4 
union all 
select 5 
union all 
select 6 
union all 
select 6 
union all 
select 7 
union all 
select 8 
union all 
select 9

Это создаст таблицу из 10 строк с 10 номерами.

Теперь другой запрос:

 SELECT @row := @row + 1 as n FROM 
    (select 0 union all select 1 union all select 3 union all select 4 union all select 5 union all select 6 union all select 6 union all select 7 union all select 8 union all select 9) t,
    (select 0 union all select 1 union all select 3 union all select 4 union all select 5 union all select 6 union all select 6 union all select 7 union all select 8 union all select 9) t1

Так как выше запрос генерирует номера строк из таблицы "t", а таблица "t1", которая разделена символом ",", означает, что они производят декартово произведение их полных строк. Например: t имеет 10 строк, а t1 также имеет 10 строк, поэтому декартово произведение производит 100 строк. Таким образом, переменная @row увеличивается в 100 раз и дает 100 строк из 100 чисел от 1 до 100.

Следующий запрос:

SUBSTRING_INDEX(SUBSTRING_INDEX(tablename.data, ' ', numbers.n), ' ', -1)

этот будет принимать "abcdefgh" один за другим.

Например: возьмите numbers.n = 1 тогда внутренняя substring_index найдет индекс первого пространства и вернет строку перед этим индексом, то есть 'a' а затем внешняя substring_index найдет пространство с конца результирующей строки и даст последний символ из строки, т.е. 'a'.

Теперь, если вы возьмете numbers.n = 2 то внутренний substring_index найдет индекс первого пространства и вернет строку перед этим индексом, то есть 'a b' а затем внешний substring_index найдет пространство с конца результирующей строки и даст последний символ из строки, т.е. 'b'

Всегда старайтесь разбивать запрос таким образом, и вы сможете понять запрос более простым способом.

  • 0
    @ Джей Шанкар Гупта: Спасибо за ваш ответ. У меня есть запрос здесь: 1. Каково значение нескольких (выбрать 0 объединить все выбрать 1 ...) операторов, как если бы я оставил один, то вывод только то же самое. 2. Здесь в этом примере значение в столбце данных мало, как только до g, которое составляет 7 символов, но в действительности этот столбец может иметь данные до 100 символов. Следовательно, я чувствую, что нет смысла записывать это состояние до 100 символов или что-то еще в реальном времени. ((выберите 0 объединить все выбрать 1 объединить все выбрать 3 ...) Спасибо !! Заметил, что вы отредактировали свой ответ одним утверждением :) Спасибо
  • 0
    нет необходимости записывать до 100 SELECT @row := @row + 1 as n FROM (select 0 union all select 1 union all select 3 union all select 4 union all select 5 union all select 6 union all select 6 union all select 7 union all select 8 union all select 9) t, (select 0 union all select 1 union all select 3 union all select 4 union all select 5 union all select 6 union all select 6 union all select 7 union all select 8 union all select 9) t1, (SELECT @row:=0) r
Показать ещё 6 комментариев

Ещё вопросы

Сообщество Overcoder
Наверх
Меню