2017-08-29 130 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;

如果您想从开始和结束开始或结尾的空格,您可以跳过上面的语句修剪。