【问题标题】:How to split values in Several rows (MySQL)如何在多行中拆分值(MySQL)
【发布时间】:2018-02-06 23:49:59
【问题描述】:

我想在 SQL 中将一行拆分为几行。

例如,我有 'A 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;

对不起,我知道那太基础了。

【问题讨论】:

    标签: mysql sql split substring


    【解决方案1】:

    您可以尝试在 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, '');
    

    那么你应该可以在查询中像这样使用它:

    SELECT SPLIT_STR('a|bb|ccc|dd', '|', 3) as third;
    

    这是未经测试的,但应该可以工作。欲了解更多信息,请查看this

    【讨论】:

      【解决方案2】:

      如果我没看错,那么这个问题已经被问过了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

      【讨论】:

      • 谢谢!它正在工作。我要改变一些东西,但工作。
      【解决方案3】:

      我相信你可以这样做:

      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

      【讨论】:

        【解决方案4】:

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

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

        如果您希望开头和结尾的前导或尾随空格,您可以跳过上述语句中的修剪。

        【讨论】:

          猜你喜欢
          • 2021-12-19
          • 1970-01-01
          • 2021-08-31
          • 2021-06-30
          • 2015-02-18
          • 2015-02-28
          • 1970-01-01
          • 2011-02-23
          • 1970-01-01
          相关资源
          最近更新 更多