2014-12-04 36 views
1

我試圖拆分字段(在某些分隔符處,在下面的示例中使用';')並將拆分結果插入表中。我想要做的是在下面的表格中說明。MySQL - 拆分字段並將結果插入列

注:絕不會有由分號分隔超過3個值(;)在第一行,但可以有少於3

mysql> SELECT * FROM new; 
+-------+------+------+------+ 
| first | a | b | c | 
+-------+------+------+------+ 
| a;b;c | NULL | NULL | NULL | 
| d;e;f | NULL | NULL | NULL | 
| g;h | NULL | NULL | NULL | 
| i  | NULL | NULL | NULL | 
+-------+------+------+------+ 

查詢的結果應該

mysql> SELECT * FROM new; 
+-------+------+------+------+ 
| first | a | b | c | 
+-------+------+------+------+ 
| a;b;c | a | b | c | 
| d;e;f | d | e | f | 
| g;h | g | h | NULL | 
| i  | i | NULL | NULL | 
+-------+------+------+------+ 

我一直試圖使用的查詢是(這個特殊的將只檢索第一個值)。

SELECT SUBSTRING_INDEX(SUBSTRING_INDEX(first, ';', 1), ';', -1) FROM new; 

但是,這種方法不提供任何幫助時,分隔字符的數量少於3個,因爲它會返回它遇到的,而不是空或空字符串(「」)的第一個字符。

任何人有任何線索如何去做這件事?

乾杯

+0

在第一列中總會有最多三個以逗號分隔的字段嗎? – radar 2014-12-04 15:37:54

回答

1

我用CASE WHEN,以確定是否有1個或多個分號

SQL Fiddle Demo

SELECT 
    first, 
    SUBSTRING_INDEX(first, ';', 1) AS 'a', 
    CASE 
    WHEN LOCATE(';', first, 1) = 0 THEN NULL 
    ELSE SUBSTRING_INDEX(SUBSTRING_INDEX(first, ';', 2), ';', -1) 
    END AS 'b', 
    CASE 
    WHEN LOCATE(';', first, 1) = 0 THEN NULL 
    WHEN LOCATE(';', first, (LOCATE(';', first, 1) + 1)) = 0 THEN NULL 
    ELSE SUBSTRING_INDEX(first, ';', -1) 
    END AS 'c' 
FROM new; 
-1

您可以通過阿爾曼P代表例如使用this解決方案。

創建函數SPLIT_STRING所示的鏈接,然後調用它像這樣:

選擇第一,SPLIT_STRING(第一, ';',1),其爲,SPLIT_STRING(第一, ';',2)爲b,SPLIT_STRING(第一, ';',3)爲c

0

SQL Fiddle

MySQL的32年5月5日架構設置

CREATE TABLE new 
    (`first` varchar(12)) 
; 

INSERT INTO new 
    (`first`) 
VALUES 
    ('ae;b;c'), 
    ('d;ee;f'), 
    ('g;he'), 
    ('ie') 
; 

查詢1

SELECT 
    first, 
    SUBSTRING_INDEX(first, ';', 1) AS 'a', 
    CASE WHEN first LIKE '%;%;%' THEN 
      SUBSTRING_INDEX(SUBSTRING_INDEX(first, ';', 2), ';', -1) 
     WHEN first LIKE '%;%' THEN 
      SUBSTRING_INDEX(first, ';', -1) 
     ELSE NULL END AS 'b', 
    CASE WHEN first LIKE '%;%;%' THEN 
      SUBSTRING_INDEX(first, ';', -1) 
     ELSE NULL END AS 'c' 
FROM new 

Results

| FIRST | A |  B |  C | 
|--------|----|--------|--------| 
| ae;b;c | ae |  b |  c | 
| d;ee;f | d |  ee |  f | 
| g;he | g |  he | (null) | 
|  ie | ie | (null) | (null) |