Рассматривая это как не что иное, как мысленное упражнение, потому что кажется, что что-то лучше всего подходит для лучшей структуры или выполняется на уровне приложения - вы можете выполнить то, что хотите, с помощью одного ужасающего уродливого запроса, например:
SELECT substring_index(substring_index(CONCAT (
trim(leading '#@' FROM trim(trailing '#@' FROM replace(replace(replace(concat_ws('#@', cola, colb, colc, cold, cole), '#@#@', '#@~!'), '~!#@', ''), '~!', ''))),
'#@'
), '#@', 1), '#@', - 1) col1,
substring_index(substring_index(CONCAT (
trim(leading '#@' FROM trim(trailing '#@' FROM replace(replace(replace(concat_ws('#@', cola, colb, colc, cold, cole), '#@#@', '#@~!'), '~!#@', ''), '~!', ''))),
'#@'
), '#@', 2), '#@', - 1) col2,
substring_index(substring_index(CONCAT (
trim(leading '#@' FROM trim(trailing '#@' FROM replace(replace(replace(concat_ws('#@', cola, colb, colc, cold, cole), '#@#@', '#@~!'), '~!#@', ''), '~!', ''))),
'#@'
), '#@', 3), '#@', - 1) col3,
substring_index(substring_index(CONCAT (
trim(leading '#@' FROM trim(trailing '#@' FROM replace(replace(replace(concat_ws('#@', cola, colb, colc, cold, cole), '#@#@', '#@~!'), '~!#@', ''), '~!', ''))),
'#@'
), '#@', 4), '#@', - 1) col4,
substring_index(substring_index(CONCAT (
trim(leading '#@' FROM trim(trailing '#@' FROM replace(replace(replace(concat_ws('#@', cola, colb, colc, cold, cole), '#@#@', '#@~!'), '~!#@', ''), '~!', ''))),
'#@'
), '#@', 5), '#@', - 1) col5
FROM yourtable;
суть ее в том, мы создаем одну строку с разделителями, содержащий все столбцы, используя concat_ws
(я использую #@
в качестве разделителя - это может быть все, что идея его вряд ли появится в строке.) , Затем мы, хотя серия из replace
звонков, преобразуем все множественные вхождения разделителя в одно вхождение. При двух вызовах trim
мы избавляемся от разделителя от переднего и конца строки, а затем добавляем его обратно в конец всех строк с помощью concat
. Затем мы можем извлечь слово в каждой позиции строки, используя substring_index
. Конечный разделитель гарантирует, что мы можем получить пустой результат, если в этой строке больше слов. Повторите это раз для каждого столбца, увеличивая смещение на внутренний вызов substring_index
, в зависимости от того, какой виртуальный столбец вы создаете.
demo here
Если вы хотите, чтобы расширить это до семи колонок, просто повторите поле в два раза больше, и увеличивать смещение каждый раз.
Есть ли когда-либо не более двух значений в строке? –
Нет, все 7 столбцов также могут быть заполнены ... Я приспособию пример. –
ugh. то нет простого запроса –