这是一个常见的问题,但我发现我的问题是独一无二的。我在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;
此函数正是我想要的:创建一个状态已删除的新列,但不会在其行中携带任何其他数据。
我想到了三个攻击这个的计划:
创建新列将原始文件拆分。我可以在Excel中使用“拆分文本到单元格”然后将其带入MySQL Workbench,但我知道SQL更强大,所以我想为此编写一个脚本。
创建一个存储每个新列的伪表(数字状态1,数字状态2等),但数据每天都在变化,因此我不想限制可以创建的新列的数量。
问你们所有人。
我参考的其他一些链接:
Split one column to multiple columns but data will vary SQL
Split string and return data in multiple columns
但我对SQL的了解仍在增长,我不知道这些功能是什么意思,我非常感谢帮助。
答案 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.