问题:
一个联系人可能有多个号码,但是源表存的时候是放在一个字段的,分隔的形式也是多种多样,现在需要将它们一个个分开,实现行转列。
举个例子,源表(phone_info)为
name | linkman_phone |
---|---|
小明 | 126;946:789*235 |
实现的结果为
name | phone_number |
---|---|
小明 | 126 |
小明 | 946 |
小明 | 789 |
小明 | 235 |
有兴趣的朋友可以先试试,不急着往后看解析。
解析思路:
利用split函数将合并在一起的字段拆分开,然后利用lateral view和explode函数将其展开显示。
代码如下:
select name,phone_number
from phone_info
lateral view explode(split(linkman_phone,'[\\;|\\:|\\*|\\|]')) mytable as phone_number;
给大家排坑:
我自己最开始在写的时候犯了个错误,很简单的错误,就是忘了select新生成的列啊,然后一直以为没有实现行转列。
比如,下面这样写是不行的。
错误代码!
select name,linkman_phone
from phone_info
lateral view explode(split(linkman_phone,'[\\;|\\:|\\*|\\|]')) mytable as phone_number;
有任何问题也欢迎留言交流,互相学习,共同进步。