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():函数需要指定分隔符,需要注意的是分隔符不能为null,如果为null,则返回结果为null。。
执行代码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()的区别
2.1区别:
他们都是将分组中的某列转为一个数组返回,不同的是collect_list不去重而collect_set去重
2.2实例
原始temp数据
id | class |
---|---|
loongshaw | 1 |
loongshaw | 2 |
loongshaw | 3 |
loongshaw | 4 |
期望值
id | class |
---|---|
loongshaw | 1,2,3,4 |
输入代码:
select
t.id,
concat_ws(',', collect_set(t.class))
from
temp t
group by
t.id
实际结果,class合并后并不是有序
id | class |
---|---|
loongshaw | 1,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合并后有序
id | class |
---|---|
loongshaw | 1,2,3,4 |
原文链接:https://blog.csdn.net/weixin_48272780/article/details/128243152
3、group_concat()函数
前言:在有group by的查询语句中,select指定的字段要么就包含在group by语句的后面,作为分组的依据,要么就包含在聚合函数中。
代码6:
select name,min(id) from tt2 group by name;
#查询了name相同的的人中最小的id

如果我们要查询name相同的人的所有的id呢?
select name,id from tt2 order by name

但是这样同一个名字出现多次,看上去非常不直观。有没有更直观的方法,既让每个名字都只出现一次,又能够显示所有的名字相同的人的id呢?——使用group_concat()
1、功能:将group by产生的同一个分组中的值连接起来,返回一个字符串结果。
2、语法:
group_concat( [distinct] 要连接的字段 [order by 排序字段 asc/desc ] [separator '分隔符'] )
说明:通过使用distinct可以排除重复值;如果希望对结果中的值进行排序,可以使用order by子句;separator是一个字符串值,缺省为一个逗号。
3、举例:
使用group_concat()和group by显示相同名字的人的id号:
select name,group_concat(id) from tt2 group by name

将上面的id号从大到小排序,且用'_'作为分隔符:
select name,group_concat(id order by id desc separator '_') from tt2 group by name;

上面的查询中显示了以name分组的每组中所有的id。接下来我们要查询以name分组的所有组的id和score:
select name,group_concat( concat_ws( '-' , id ,score) order by id ) from tt2 group by name;

posted on 2025-02-24 16:55 ExplorerMan 阅读(23) 评论(0) 编辑 收藏 举报
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· TypeScript + Deepseek 打造卜卦网站:技术与玄学的结合
· 阿里巴巴 QwQ-32B真的超越了 DeepSeek R-1吗?
· 【译】Visual Studio 中新的强大生产力特性
· 【设计模式】告别冗长if-else语句:使用策略模式优化代码结构
· 10年+ .NET Coder 心语 ── 封装的思维:从隐藏、稳定开始理解其本质意义
2022-02-24 gorm.Clause()子句分析之ON DUPLICATE KEY UPDATE
2021-02-24 pyspark Sparkconf()参数配置
2021-02-24 rabbitmq basicReject / basicNack / basicRecover区别
2019-02-24 在Flask中使用Celery的最佳实践
2019-02-24 二十三种设计模式及其python实现
2019-02-24 常见设计模式 (python代码实现)
2019-02-24 设计模式(Python)-观察者模式