SQL之concat()collect_set()collect_list()和concat_ws()用法

Posted 安利“一个处女座的程序员”

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了SQL之concat()collect_set()collect_list()和concat_ws()用法相关的知识,希望对你有一定的参考价值。

1、concat_ws()函数和concat()函数的拼接使用极其区别

1.1区别

concat():函数在连接字符串的时候,只要其中一个是NULL,那么将返回NULL

执行代码:
select concat('a','b',null);

执行结果:
NULL

concat_ws():函数在连接字符串的时候,只要有一个字符串不是NULL,就不会返回NULL。concat_ws():函数需要指定分隔符

执行代码1:
hive> 
select concat_ws('-','a','b');
执行结果:
a-b

执行代码2:
hive> 
select concat_ws('-','a','b',null);
执行结果:
a-b

执行代码3:
hive> 
select concat_ws('','a','b',null);
执行结果:
ab

2、collect_set()无序和collect_list()的区别

参考链接:SQL小知识点系列-3-collect_list/collect_set(列转行) - 知乎

2.1区别:

他们都是将分组中的某列转为一个数组返回,

不同的是collect_list不去重而collect_set去重

2.2 collect_list()函数有序不去重

2.3 collect_set()无序去重

根据某个字段分组后,利用collect_list()函数把分在一组的数据合并在一起,默认分隔符’,’ 如

abc
11“1”,“2”
12“1”,"2”
12“1”,“2”,“2”

2.4实例

原始temp数据

idclass
loongshaw1
loongshaw2
loongshaw3
loongshaw4

期望值

idclass
loongshaw1,2,3,4

输入代码:

select
  t.id,
  concat_ws(',', collect_set(t.class))
from
  temp t
group by
  t.id

实际结果,class合并后并不是有序

idclass
loongshaw1,3,2,4

解决方式:
将collect_set无序集合,改成collect_list或sort_array进行排序。

concat_ws(',', sort_array(collect_set(t.class), false))

sort_array(e: column, asc: boolean)将array中元素排序(自然排序),默认asc。

或者:

concat_ws(',',collect_list(t.class))

结果,class合并后有序

idclass
loongshaw1,2,3,4

SQL实现将多行记录合并成一行

SQL实现将多行记录合并成一行

我们在数据开发的过程中,经常会遇到这样的需求,就是将多行合并为一行,并且用特定字符隔开。

1、数据处理前

2,结果数据展示

3,hive处理方式

在hive里面,用concat_ws函数处理
格式: concat_ws(‘分隔符’,collect_set/collect_list(字段))
参数释义:
concat_ws:多行合并一行函数
collect_set:合成数组,数据已去重
collect_list:合成数组, 数据未去重

SQL脚本:
select school,concat_ws(',',collect_set(name)) from student
group by school;

4,MySQL处理方式

GROUP_CONCAT(字段 分隔符)
注意:MySQL在GROUP_CONCAT函数中,去重需要使用distinct 关键字,如果需要先排序再合并,也可以使用order by 关键字。

select school,GROUP_CONCAT(name,',') from student
group by school;

我是喵,有问题随时沟通哟~~~

以上是关于SQL之concat()collect_set()collect_list()和concat_ws()用法的主要内容,如果未能解决你的问题,请参考以下文章

SQL实现将多行记录合并成一行

SQL实现将多行记录合并成一行

SQL实现将多行记录合并成一行

SQL实现将多行记录合并成一行

SQL实现将多行记录合并成一行

SQL实现将多行记录合并成一行