Clickhouse 字符串拆分 OR 一行转多行

Clickhouse 字符串拆分 OR 一行转多行

 

我想把 '123_456_142354_23543' 通过'_' 下划线进行拆分成 👇的结果

 

 

这个需求在excel 上也很容易实现,通过分列功能,然后转置一下就可以得到如上图一样的结果了,但是我们业务中不能通过excel 来实现,这是要 SQL代码层线上实现的。

现在我们来看看通过clickhouse 如何实现的,首先我们要学习几个clickhosue 的函数,这几个函数很好用,果然是俄罗斯的硬核黑科技,使用起来就那么简单,直接

 

第一个:字符串拆分函数  splitByChar(分隔符,s)

将字符串以'separator'拆分成多个子串。'separator'必须为仅包含一个字符的字符串常量。

返回拆分后的子串的数组。 如果分隔符出现在字符串的开头或结尾,或者如果有多个连续的分隔符,则将在对应位置填充空的子串。

select     splitByChar('_', '123_456_142354_23543__') AS src

结果输出👇:

 

 

 通过结果我们可以看到该字符串拆分后,组成来一个数组,后面的'_' 两下划线,就是指在多个连续的分隔符的情况下,则在对应的位置填充空的子串。

 第二: arrayJoin函数 

'arrayJoin'函数获取每一行并将他们展开到多行(unfold)。

此函数将数组作为参数,并将该行在结果集中复制数组元素个数。
除了应用此函数的列中的值之外,简单地复制列中的所有值;它被替换为相应的数组值。

SELECT arrayJoin([1, 2, 3] AS src) AS dst, 'Never Give Up', src;

结果👇:

 

 

 

现在大家看了这两个函数之后,应该对于字符串拆分有点头绪了吧,就两个函数搞定,就是那么简单粗暴。

 select  toInt32(arrayJoin(splitByChar('_', '123_456_142354_23543') AS src)) as number;

 

 

 

这样就得出我们想要的结果,注意Clickhouse 对于数据类型,大小写很敏感哦。

这只是一个字符串拆分的简单案例,以后遇到类似的问题可以触类旁通哦。 

 

posted @ 2020-04-17 22:40  小花田半亩  阅读(12474)  评论(0编辑  收藏  举报