2015-05-12 3 views
2

Без правильной фразы это сложно описать, поэтому приведу пример. Рассмотрим следующие данные:Ограничивающие столбцы MySQL (SQL вообще)

colA  colB  colC  colD  colE 
------------------------------------------------ 
Hello  from       
      this  is   
Can       i   
             please? 
But  also  all  columns pop'd 

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

col1  col2  col3  col4  col5 
------------------------------------------------ 
Hello  from 
this  is 
Can  i 
please? 
But  also  all  columns pop'd 

В основном данные сдвигаются влево. Я думал об использовании инструкции CASE WHEN, но это довольно сложно, поскольку на самом деле это 7 столбцов (не 5, как указано в примере выше).

Что было бы самым эффективным способом получить этот результат. Имя результирующих столбцов не имеет значения, они переименовываются в любом случае.

+0

Есть ли когда-либо не более двух значений в строке? –

+0

Нет, все 7 столбцов также могут быть заполнены ... Я приспособию пример. –

+0

ugh. то нет простого запроса –

ответ

0

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

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

Если вы хотите, чтобы расширить это до семи колонок, просто повторите поле в два раза больше, и увеличивать смещение каждый раз.

+0

Некоторые мысли лучше оставить unthunk :-( – Strawberry

+0

это, наверное, хорошая вещь, я не работаю в генетике. –

Смежные вопросы