如何在几行中拆分值(MySQL)

时间:2017-08-29 13:30:04

标签: mysql sql split substring

我想在SQL中的几行中拆分一行。

例如,我有' ADCT DROP INCALL - ' ,其中包含空格和' - '并且我希望例如在几行中值保持分离。

原始结果:

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;

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

4 个答案:

答案 0 :(得分:0)

您可以尝试在MySQL中创建函数,如下所示:

{{1}}

然后你应该能够在查询中使用它:

{{1}}

这是未经测试但应该有效。有关详细信息,请查看this

答案 1 :(得分: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

答案 2 :(得分: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

答案 3 :(得分:0)

如果您只需要替换空格 - 那么您可以使用

SELECT TRIM(BOTH" \ n" FROM REPLACE(REPLACE(column_name,''," \ n")," - &# 34;," \ n"))FROM table;

如果你想要从开头和结尾开始前导或尾随空格,你可以从上面的语句中跳过trim。