关于SparkSQL中concat函数的使用与一些坑
2021/7/22 19:06:56
本文主要是介绍关于SparkSQL中concat函数的使用与一些坑,对大家解决编程问题具有一定的参考价值,需要的程序猿们随着小编来一起学习吧!
事情是这样的,在使用sparkSQL执行SQL脚本时,遇到如下的情况:
nvl(concat( case WHEN zs.scxs <> 0 THEN concat( '故障发生时:距离上次巡视的时间间隔(平均):' , zs.scxs , '天,') end , case when zs.jscxs <> 0 then concat( '近三次平均巡视时间间隔(平均):' ,zs.jscxs , '天') end), '故障发生时,未开展巡视') zsxs
计算结果表的zsxs字段数据都为‘故障发生时,未开展巡视’,而原表中zs.scxs和zs.jscxs也并不是都等于0,所以很显然是不对的。
后来通过查询相关文档发现,concat函数在MySQL和oracle中的用法是不同的。
Oracle的concat函数只能连接两个字符串,不能多也不能少
select concat('11','22') from test;//1122
MySQL的concat函数可以连接多个字符串,但是在连接字符串的时候,只要其中一个是NULL,那么将返回NULL
select concat('11','22',null);//null
而Oracle的concat函数连接的时候,只要有一个字符串不是NULL,就不会返回NULL
select concat('11',NULL) from dual;//11
concat函数在MySQL和Oracle有如此大的区别,那在sparkSQL中是什么样的呢?通过测试,sparkSQL中的效果与MySQL类似:
还是拿上面的例子,两个case when应该有存在null的情况,concat函数里参数其中一个是NULL,那么将返回NULL,所以最后nvl函数后,得到的结果数据一直都是那段字符串。
解决方案:
使用concat_ws函数替代concat函数。
和concat不同的是, concat_ws函数在执行的时候,不会因为NULL值而返回NULL
select concat_ws(',','11','22','33');//11,22,33 select concat_ws('|','11','22','33');//11|22|33 select concat_ws('*','11','22',NULL);//11*22
这篇关于关于SparkSQL中concat函数的使用与一些坑的文章就介绍到这儿,希望我们推荐的文章对大家有所帮助,也希望大家多多支持为之网!
- 2024-11-20获取apk的md5值有哪些方法?-icode9专业技术文章分享
- 2024-11-20xml报文没有传 IdentCode ,为什么正常解析没报错呢?-icode9专业技术文章分享
- 2024-11-20如何知道代码有没有进行 Schema 验证?-icode9专业技术文章分享
- 2024-11-20Mycat教程:新手快速入门指南
- 2024-11-20WebSocket入门:轻松掌握WebSocket基础
- 2024-11-19WebSocket入门指南:轻松搭建实时通信应用
- 2024-11-19Nacos安装资料详解:新手入门教程
- 2024-11-19Nacos安装资料:新手入门教程
- 2024-11-19升级 Gerrit 时有哪些注意事项?-icode9专业技术文章分享
- 2024-11-19pnpm是什么?-icode9专业技术文章分享