博客 SQL 将一列拆分成多列

SQL 将一列拆分成多列

   数栈君   发表于 2023-09-21 10:44  173  0

数据库中有业务表t1和字典表dictionary

t1表:                                                    dictionary表:
http://dtstack-static.oss-cn-hangzhou.aliyuncs.com/2021bbs/files_user1/article/dfdb7d085bab6002721c9884c00c1922..png
                            

http://dtstack-static.oss-cn-hangzhou.aliyuncs.com/2021bbs/files_user1/article/e0210448fb34b6a093561265d3dcf92f..png
  


需求一:将col列拆分成三列

SQL 代码如下所示:

方法一:

SELECT col,a[1] a1,a[2] a2,a[3] a3
FROM
    (
        SELECT regexp_split_to_array( col, ',' ), col FROM t1
    ) AS dt (a)
效果:

http://dtstack-static.oss-cn-hangzhou.aliyuncs.com/2021bbs/files_user1/article/aae6b6baed41eaf284d08ef5e5e9da6f..png
  

方法二:

SELECT
    col,
    SPLIT_PART( col, ',', 1 ) a1,
    SPLIT_PART( col, ',', 2 ) a2,
    SPLIT_PART( col, ',', 3 ) a3
FROM
    t1
效果:

http://dtstack-static.oss-cn-hangzhou.aliyuncs.com/2021bbs/files_user1/article/cb4b139123e4e791216690e8327642e2..png
  

假设想把 "col" 列分成 "col1" 、 "col2"、 "col3",SQL语句:
1、先添加新的列
ALTER TABLE t1 ADD COLUMN col1 VARCHAR(30);
ALTER TABLE t1 ADD COLUMN col2 VARCHAR(30);
ALTER TABLE t1 ADD COLUMN col3 VARCHAR(30);
2、再用 SPLIT_PART 函数填充新的列
UPDATE t1
SET col1 = SPLIT_PART( col, ',', 1 ),
col2 = SPLIT_PART( col, ',', 2 ),
col3 = SPLIT_PART( col, ',', 3 );
效果:

http://dtstack-static.oss-cn-hangzhou.aliyuncs.com/2021bbs/files_user1/article/5a2f932718633207cb897a58c8eff49f..png
  

需求二:列col保存的数据,是字典表dictionary中id值拼接的字符串,想关联出对应 的name值。
SQL 代码如下所示:

SELECT col,
    (SELECT name from dictionary WHERE id=a[1]) a1,
    (SELECT name from dictionary WHERE id=a[2]) a2,
    (SELECT name from dictionary WHERE id=a[3]) a3
FROM
    (
        SELECT regexp_split_to_array( col, ',' ), col FROM t1
    ) AS dt (a)
效果:

http://dtstack-static.oss-cn-hangzhou.aliyuncs.com/2021bbs/files_user1/article/fdcfd86fe1d9e3d73ebc661509622197..png
  

需求三:列col转化为字典表dictionary中name拼接的字符串
SQL 代码如下所示:

SELECT col,CONCAT_WS(',',a1,a2,a3) as names
FROM
    (    
        SELECT col,
            (SELECT name from dictionary WHERE id=a[1]) a1,
            (SELECT name from dictionary WHERE id=a[2]) a2,
            (SELECT name from dictionary WHERE id=a[3]) a3
        FROM
            (
                SELECT regexp_split_to_array( col, ',' ), col FROM t1
            ) AS dt (a)
    ) as temp
效果:

http://dtstack-static.oss-cn-hangzhou.aliyuncs.com/2021bbs/files_user1/article/325c7ad81d2ac65c04f9bd2eddad6fff..png
  

总结 :

我们可能会遇到按分隔符拆成多行或者多列的情况,以及复制的业务需求,只需视情况调整sql语句,或者编写存储过程。

对于列col的值,按分隔符拆分为多列数据时,不知道需要拆分成几列,可以先用以下sql查询出列数。

SELECT max(array_length(regexp_split_to_array(col,','),1))
FROM t1;






责申明:


本文系转载,版权归原作者所有,如若侵权请联系我们进行删除!

《数据治理行业实践白皮书》下载地址:https://fs80.cn/4w2atu

《数栈V6.0产品白皮书》下载地址:
https://fs80.cn/cw0iw1

想了解或咨询更多有关袋鼠云大数据产品、行业解决方案、客户案例的朋友,浏览袋鼠云官网:
https://www.dtstack.com/?src=bbs

同时,欢迎对大数据开源项目有兴趣的同学加入「袋鼠云开源框架钉钉技术群」,交流最新开源技术信息,群号码:30537511,项目地址:
https://github.com/DTStack

0条评论
社区公告
  • 大数据领域最专业的产品&技术交流社区,专注于探讨与分享大数据领域有趣又火热的信息,专业又专注的数据人园地

最新活动更多
微信扫码获取数字化转型资料
钉钉扫码加入技术交流群