У меня есть таблица в 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, но не смог достичь своего результата. Заранее спасибо !!
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
Проверить ссылку для вывода
ОБЪЯСНЕНИЕ: сначала выполните внутренний запрос, т.е.
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'
Всегда старайтесь разбивать запрос таким образом, и вы сможете понять запрос более простым способом.
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
GROUP_CONCAT()
. В сложившейся ситуации это непросто изменить только в MySQL - предложите написать небольшой ETL-скрипт, который сделает это за вас.