MySQL的;将一列拆分为多列;每天更改数据

时间:2014-03-10 23:34:07

标签: sql string split mysql-workbench multiple-columns

这是一个常见的问题,但我发现我的问题是独一无二的。我在MySQL工作台中有一个数据库,它在一个列中有多个订单号(不一致的长度)和状态条件(三种类型)。我必须将订单号与其状态和订单号相互分开。

我有什么:

|NUMBER_STATUS|

|1234-START, 12323-END|
|234 - END, 12423-START, 53443-WIP|

我的最终输出应该是:

|Number_STATUS_1|   |Number_STATUS_2|    |Number_STATUS_3|
      1234               12323  
       234               12423                 53443

有超过25,000个数据点。到目前为止,我已经尝试编写左功能:

SELECT *,
    LEFT(NUMBER_STATUS, locate('-START', NUMBER_STATUS)-1) AS 'NUMBER_STATUS_1'
FROM Request; 

此函数正是我想要的:创建一个状态已删除的新列,但不会在其行中携带任何其他数据。

我想到了三个攻击这个的计划:

  1. 创建新列将原始文件拆分。我可以在Excel中使用“拆分文本到单元格”然后将其带入MySQL Workbench,但我知道SQL更强大,所以我想为此编写一个脚本。

  2. 创建一个存储每个新列的伪表(数字状态1,数字状态2等),但数据每天都在变化,因此我不想限制可以创建的新列的数量。

  3. 问你们所有人。

  4. 我参考的其他一些链接:

    Split one column to multiple columns but data will vary SQL

    Split string and return data in multiple columns

    但我对SQL的了解仍在增长,我不知道这些功能是什么意思,我非常感谢帮助。

1 个答案:

答案 0 :(得分:0)

这是我用来解决问题的方法: 我出于个人原因更改了表名和列名。我希望这有助于将来的其他人!

/*remove status name from data*/

Update table
Set
            columnSTATUS = REPLACE(columnSTATUS, '-status1', '');

Update table
Set
                columnSTATUS = REPLACE(columnSTATUS, '-staus2', '');

Update table
Set
                columnSTATUS = REPLACE(columnSTATUS, '-status3', '');

    /*split data into columns*/
    UPDATE table SET
        `column1` = IF ( 
            LOCATE(',', columnSTATUS) >0,
            SUBSTRING(columnSTATUS, 1,LOCATE(',', columnSTATUS)-1),
            column_STATUS
    ),
        `column2` = IF( 
            LOCATE(',', columnSTATUS) > 0,
            SUBSTRING(columnSTATUS, LOCATE(',', columnSTATUS)+1),
            ''); 
    UPDATE table SET
        `column3` = IF (
            LOCATE(',', column2) >0, 
            SUBSTRING(column2, LOCATE(',', column2)+1), '');
    UPDATE table SET
        `column4` = IF (
            LOCATE(',', column3) >0, 
            SUBSTRING(column3, LOCATE(',', column3)+1), '');

    /*remove data remaining in column after commas*/
    UPDATE table SET 
        column2 = SUBSTRING_INDEX(column2, ',', 1);
    UPDATE Service_Request SET
        column3 = SUBSTRING_INDEX(column3,',',1);


NB: I do not have a choice how the data is imported.