目录
0 问题描述
表名:t2
表字段及内容:
a
1011
0101
问题:如何将字符'1'的位置提取出来
输出结果如下所示:
1,3,4
2,4
1 数据准备
create table t2 as
select '1011' as a
UNION ALL
select '0101' as a
2 问题分析
核心思想:
核心SQL如下:
select a
,concat_ws(',',collect_list(cast(pos as string))) as res
from(
select t2.a as a
,t1.pos + 1 as pos --注意索引是从0开始的因此要加1
,t1.val as val
from t2 lateral view posexplode(split(a,'')) t1 as pos,val
) t
where val != '0' and val != ''
group by a
结果如下:
+-------+--------+
| a | res |
+-------+--------+
| 0101 | 2,4 |
| 1011 | 1,3,4 |
+-------+--------+
3 小结
本文给出了一种采用SQL语言遍历字符串的方法及技巧,主要采用split()函数及posexplode()函数进行解析字符串,并利用表生成函数与原表进行关联,这一技巧在处理字符串时候经常使用忘读者掌握。