美文网首页
mysql列转行(逗号分隔)

mysql列转行(逗号分隔)

作者: 米小河123 | 来源:发表于2019-12-16 10:21 被阅读0次

    mysql查询含逗号的数据,将逗号拆分为多行展示:

    原始数据如下:

    ID VALUE
    1 yang,zheng,song
    2 zhao,qian,sun
    3 jiang

    现在因为新的需求,需要将这些数据转化为如下形式:

    ID VALUE
    1 yang
    1 zheng
    1 song
    2 zhao
    2 qian
    2 sun
    3 jiang

    假设我们需要处理的表结构为:

    NAME TYPE LEN
    ID INT 11
    NAME VARCHAR 255

    使用如下sql语句即可实现需求:

    SELECT a.id,
    substring_index( substring_index( a.name, ',', b.help_topic_id + 1 ), ',',- 1 ) name
    FROM table1 a
    JOIN mysql.help_topic b ON b.help_topic_id < ( length( a.name ) - length( REPLACE ( a.name, ',', '' ) ) + 1 ) 
    ORDER BY a.id
    

    查询的主要思路为,原表与一个包含连续自增长字段的表进行join,得到字符串分隔后的索引值,其中length( a.name ) - length( REPLACE ( a.name, ',', '' ) ) + 1语句获得字符串逗号分隔之后得到的数据长度,两表关联之后,会得到相应行数的数据。比如,

    1 yang,zheng.song

    在join之后会得到:

    ID NAME HELP_TOPIC_ID
    1 yang,zheng,song 0
    1 yang,zheng,song 1
    1 yang,zheng,song 2

    之后对查询中的结果,使用substring_index方法进行截取,然后得到我们自己想要的数据。

    备注:我们在join的时候借助了mysql.help_topic表,表中的help_topic_id是从0到582连续自增的数值,如果遇到数据经过逗号分隔之后得到的数组长度大于582,则需要自己建立一个连续自增表来进行join,比如:

    create table incre_table (AutoIncreID int);
    insert into incre_table values (0);
    insert into incre_table values (1);
    insert into incre_table values (2);
    

    相关文章

      网友评论

          本文标题:mysql列转行(逗号分隔)

          本文链接:https://www.haomeiwen.com/subject/zburnctx.html