2017-08-29 131 views
0

我想在SQL中拆分多行中的一行。如何拆分多行中的值(MySQL)

例如,我有「A DROP ADCT門店 - 」包含空間和「 - 」我想,有值,例如幾行保持獨立。

原始結果:

SELECT statuses FROM campaigns; 
+-----------------------------------------+ 
| RESULT OF QUERY       | 
+-----------------------------------------+ 
| A ADCT DROP INCALL -     | 
+-----------------------------------------+ 

結果一定很喜歡:

+-----------------------------------------+ 
| RESULT OF QUERY       | 
+-----------------------------------------+ 
| A          | 
| ADCT         | 
| DROP         | 
| INCALL         | 
+-----------------------------------------+ 

我嘗試用SUBSTRING_INDEX像:

SELECT status 
FROM statuses 
WHERE statuses.status NOT IN (SELECT SUBSTRING_INDEX(TRIM(dial_statuses)," ", 1) FROM campaigns WHERE campaign_id = '4000') 
ORDER BY STATUS; 

我很抱歉,我知道這是非常基本的。

謝謝!

回答

0

我相信你能做到這樣的:

SELECT 
    tablename.id, 
    SUBSTRING_INDEX(SUBSTRING_INDEX(tablename.name, ',', numbers.n), ',', -1) 
    name 
FROM 
    numbers 
INNER JOIN tablename ON CHAR_LENGTH(tablename.name) 
-CHAR_LENGTH(REPLACE(tablename.name, ',', ''))>=numbers.n-1 
ORDER BY 
    id, n 

請參閱小提琴here

如果您不能創建一個表,然後一個解決方案可以是這樣:

SELECT 
    tablename.id, 
    SUBSTRING_INDEX(SUBSTRING_INDEX(tablename.name, ',', numbers.n), ',', -1) 
    name 
FROM 
    (select 1 n union all 
    select 2 union all select 3 union all 
    select 4 union all select 5) numbers 
INNER JOIN tablename ON CHAR_LENGTH(tablename.name) 
-CHAR_LENGTH(REPLACE(tablename.name, ',', ''))>=numbers.n-1 
ORDER BY 
    id, n 

爲例小提琴是here

+0

它也在工作。多謝,夥計。 –

0

你可以嘗試在MySQL創建功能如下:

CREATE FUNCTION SPLIT_STR(
    x VARCHAR(255), 
    delim VARCHAR(12), 
    pos INT 
) 
RETURNS VARCHAR(255) 
RETURN REPLACE(SUBSTRING(SUBSTRING_INDEX(x, delim, pos), 
    LENGTH(SUBSTRING_INDEX(x, delim, pos -1)) + 1), 
    delim, ''); 

那麼你應該能夠在查詢中使用這樣的:

​​

這是未經測試,但應該工作。欲瞭解更多信息,請查詢this了。

0

,如果我正確地讀這篇文章,那麼這個問題已經被問here

SQL split values to multiple rows

答案國從@fthiella如下:

select 
tablename.id, 
    SUBSTRING_INDEX(SUBSTRING_INDEX(tablename.name, ',', numbers.n), ',', -1) name 
from 
    (select 1 n union all 
    select 2 union all select 3 union all 
    select 4 union all select 5) numbers INNER JOIN tablename 
    on CHAR_LENGTH(tablename.name) 
    -CHAR_LENGTH(REPLACE(tablename.name, ',', ''))>=numbers.n-1 
order by 
    id, n 

看到一個工作示例here

http://sqlfiddle.com/#!9/ffa86a/1

+0

謝謝!它正在工作。我想改變一些事情,但工作。 –

0

如果僅更換空間和 - 然後你可以使用

SELECT TRIM(BOTH 「\ n」 FROM REPLACE(REPLACE(列名,」」, 「\ n」), 「 - 」,「 \ n「))FROM table;

如果您想從開始和結束開始或結尾的空格,您可以跳過上面的語句修剪。