concat_ws:分隔符连接字符串
速查结论
concat_ws(sep, str1, str2, ...) 是 Spark SQL 中用于使用分隔符连接字符串的函数。自动跳过 NULL 值,不会因 NULL 导致整个结果为 NULL。与 concat 的区别是:concat_ws 支持指定分隔符且忽略 NULL。
语法
concat_ws(sep[, str | array(str)]+)
参数说明
| 参数 | 说明 |
|---|---|
sep | 分隔符字符串。为 NULL 时整个结果返回 NULL |
str | 一个或多个字符串表达式,或字符串数组 |
返回值:用 sep 连接所有非 NULL 字符串的结果(STRING 类型)。如果 sep 为 NULL 则返回 NULL。
Since: 1.5.0
示例
基础连接
-- 空格分隔
SELECT concat_ws(' ', 'Spark', 'SQL');
-- 结果: Spark SQL
-- 斜杠分隔
SELECT concat_ws('/', 'home', 'user', 'docs');
-- 结果: home/user/docs
自动跳过 NULL
-- NULL 值被自动跳过
SELECT concat_ws('/', 'foo', NULL, 'bar');
-- 结果: foo/bar
-- 对比 concat:一个 NULL 导致整个结果为 NULL
SELECT concat('foo', '/', NULL, '/', 'bar');
-- 结果: NULL
分隔符为 NULL
-- 分隔符为 NULL,整个结果返回 NULL
SELECT concat_ws(NULL, 'Spark', 'SQL');
-- 结果: NULL
连接数组
-- 连接数组元素
SELECT concat_ws(',', array('a', 'b', 'c'));
-- 结果: a,b,c
concat_ws vs concat vs array_join 对比
| 函数 | NULL 处理 | 分隔符 | 适用场景 |
|---|---|---|---|
concat_ws(sep, ...) | 跳过 NULL | 必须指定 | 多列拼接,列中含 NULL |
concat(str1, ...) | 任一 NULL 则全部 NULL | 无 | 多列拼接,确保不含 NULL |
array_join(arr, sep) | 跳过 NULL | 必须指定 | 连接数组元素 |
-- concat_ws: 跳过 NULL
SELECT concat_ws('-', col1, col2, col3) FROM t;
-- concat: 一个 NULL 全盘 NULL
SELECT concat(col1, '-', col2, '-', col3) FROM t;
-- array_join: 数组专用
SELECT array_join(array('a', 'b', 'c'), '-');
-- 结果: a-b-c
常见报错与避坑指南
分隔符为 NULL
唯一能让 concat_ws 返回 NULL 的情况就是分隔符为 NULL。
-- 错误写法:分隔符可能为 NULL
SELECT concat_ws(t.sep, 'a', 'b') FROM t;
-- 如果 sep 为 NULL,结果永远是 NULL
-- 正确写法:确保分隔符不为 NULL
SELECT concat_ws(coalesce(sep, ' '), 'a', 'b') FROM t;
所有参数都是 NULL
当所有输入字符串都为 NULL 时,结果为空字符串,而不是 NULL。
-- 所有参数都是 NULL
SELECT concat_ws(',', NULL, NULL);
-- 结果: ''(空字符串,不是 NULL)
📱关注公众号
「数据仓库技术」文章同步更新,不错过每一篇干货

💬加群交流
备注「数据仓库技术」加入社群,每日一道大厂SQL真题
