MySQL更新和拆分列,多个列用逗号分隔

MySQL更新和拆分列,多个列用逗号分隔,mysql,comma,Mysql,Comma,我有一个数据库,其中一个表有一列包含一些特殊数据,但这些数据不符合1NF、2NF、3NF等数据库结构 ID VALUE 1 00 1 03 1 01 1 05 1 20 1 40 在该列中,我有0,3,1,5,20,40等值,如varchar和 我想写一个SQL查询来更新这个列,使它像00,03,01,05,20,40一样,还必须注意,许多值都有两位数字,这些值我不想在前面加一个零 COLU

我有一个数据库,其中一个表有一列包含一些特殊数据,但这些数据不符合1NF、2NF、3NF等数据库结构

    ID   VALUE
    1    00
    1    03
    1    01
    1    05
    1    20
    1    40
在该列中,我有0,3,1,5,20,40等值,如varchar和 我想写一个SQL查询来更新这个列,使它像00,03,01,05,20,40一样,还必须注意,许多值都有两位数字,这些值我不想在前面加一个零

    COLUMN1
    0,3,1,5,20,40,

    MUST LOOKS LIKE
    00,03,01,05,20,40,
我试着用replace函数来做

问题1是,当我加上额外的零时,我想保留上一个值。 问题2是,当逗号之间的值只有一位时,必须执行此操作! 然后,当我用SQL查询解决这个问题时,我会将此列拆分到另一个表中,该表中的数据遵循数据库结构

    ID   VALUE
    1    00
    1    03
    1    01
    1    05
    1    20
    1    40

那么,我该怎么做呢?

我相信这会奏效。它没有考虑多行。。所以,如果你想这样做,那么你需要按照一个特定的字段分组,你想把concat分组。但这是在使用逗号分隔列表时必须处理的问题

SELECT
    GROUP_CONCAT(LPAD(SUBSTRING_INDEX(SUBSTRING_INDEX(column1, ',', n.digit+1), ',', -1), 2, '0')) col
FROM your_table
JOIN
(   SELECT
        SEQ.SeqValue as digit
    FROM
    (   SELECT (TENS.SeqValue + ONES.SeqValue) SeqValue
        FROM(SELECT 0  SeqValue UNION ALL SELECT 1 UNION ALL SELECT 2 UNION ALL SELECT 3 UNION ALL SELECT 4 UNION ALL SELECT 5 UNION ALL SELECT 6 UNION ALL SELECT 7 UNION ALL SELECT 8 UNION ALL SELECT 9) ONES
        CROSS JOIN(SELECT 0 SeqValue UNION ALL SELECT 10 UNION ALL SELECT 20 UNION ALL SELECT 30 UNION ALL SELECT 40 UNION ALL SELECT 50 UNION ALL SELECT 60 UNION ALL SELECT 70 UNION ALL SELECT 80 UNION ALL SELECT 90) TENS
    ) SEQ
) n
ON LENGTH(REPLACE(column1, ',' , '')) <= LENGTH(column1)-n.digit
ORDER BY n.digit
下面是一个演示,其中column1有多行,具有唯一id,以便您可以按它分组


如果另一个答案中的优雅方法不起作用,请尝试蛮力方法

它在每边查找带有逗号的单个数字,并将其替换为带有前导零的版本,最后通过在第二个位置查找逗号并预挂起零来查找前面的单个数字

update test 
SET column1 = REPLACE(column1,",0,",",00,");
update test 
SET column1 = REPLACE(column1,",1,",",01,");
update test 
SET column1 = REPLACE(column1,",2,",",02,");
update test 
SET column1 = REPLACE(column1,",3,",",03,");
update test 
SET column1 = REPLACE(column1,",4,",",04,");
update test 
SET column1 = REPLACE(column1,",5,",",05,");
update test 
SET column1 = REPLACE(column1,",6,",",06,");
update test 
SET column1 = REPLACE(column1,",7,",",07,");
update test 
SET column1 = REPLACE(column1,",8,",",08,");
update test 
SET column1 = REPLACE(column1,",9,",",09,");
update test 

SET column1 = concat("0",column1)
where mid(column1,2,1) = ",";

我知道1NF、2ND、3NF,但这次有必要这样做!:有多少个逗号分隔的值?逗号的最大数目必须是47,所以我的varchar是47*3,当我的数据越来越大时,我将移动到标准化,现在为了演示,我必须这样做。我不知道为什么这个问题被一些人否决了,这是一次尝试,首先小心地更新一个旧的结构不良的数据库,然后进行必要的转换以满足1NF、2NF、3NF并优化效率。非常感谢,它似乎做到了这一点,那么我如何才能更新该表中的所有行呢?@s19k15看我发布的第二个演示。您需要根据您的唯一列进行分组is@s19k15你看过第二个链接了吗?查看如何在创建表中设置数据part@s19k15是的,所以不管唯一的列aka主键是什么,只要按它分组就可以了。查询所做的是规范化您的数据添加0,然后重新分组谢谢,您帮了我很多忙,但我在00,-1,00结尾得到了一些奇怪的结果在我回答的评论中OP的数据布局与问题中的完全不同。。。我甚至不想再尝试回答它了。@John Ruddell没有人逼你去awnser,但谢谢你的尝试,除了你的sql,我学到了很多。我的问题中的数据也是如此!最后的数据是sqlfiddle可以尝试的!没有,没有人逼我回答。我喜欢回答。。但在花了一个小时的时间之后,你向我展示了数据与你最初所说的完全不同。我不想再尝试回答这样的问题了。您好,@John Ruddell对awnsered标记延迟表示抱歉,您的方式确实成功地完成了工作,感谢您花费的时间,您的代码正在为我发布的数据工作!