2014-04-15 136 views
1

我想分割列中的數據,該列是以文本格式顯示並由'|'分隔。 'mysql將一列分割爲多列

0190000000001000000000| 0150000000002500000000| 0190000000003500000000| 

就像上面的列數據一樣,有三部分。根據系統記錄的數據,這些數據部分可以增加或減少。

任何人都可以幫我把上面的文字類型分開。

+0

你必須使用一種編程語言,而不僅僅是mysql。正如你可以創建一個在SQL中分割的函數,但它永遠不會返回一個數組,所以只用mysql來做你想做的事情幾乎是不可能的。 – CodeBird

+0

網上有很多資源解釋如何做到這一點,或者至少訪問該列表的一個元素。 ([示例](http://dev.mysql.com/doc/refman/5.0/en/string-functions.html))但是,如果你問我,那麼這種事情會顯示一個非常糟糕的數據結構。如果你有多個數據,你應該有多個字段和/或多個記錄... –

+0

@Bartdude,我認爲這就是他想要做的,據我所知他正試圖修復他的表格結構 – CodeBird

回答

0

答案是substring_index(),但要獲得個人價值,你需要使用函數兩次:

select substring_index(col, '|', 1) as element_1, 
     substring_index(substring_index(col, '|', 2), '|', -1) as element_2, 
     substring_index(substring_index(col, '|', 3), '|', -1) as element_3 

你可以無限延伸到第n個元素。但是有一個問題!如果一列只有兩個值,那麼你會得到重複的值。解決這個問題需要更多的工作。這裏有一種方法:

select substring_index(col, '|', 1) as element_1, 
     (case when substring_index(col, '|', 2) = substring_index(col, '|', 1) then NULL 
      else substring_index(substring_index(col, '|', 2), '|', -1) 
     end) as element_2, 
     (case when substring_index(col, '|', 3) = substring_index(col, '|', 2) then NULL 
      else substring_index(substring_index(col, '|', 3), '|', -1) 
     end) as element_3