跳到主要内容

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真题

交流微信二维码

你可能还想看