首页 / 字符串
CONCAT_WS 按分隔符拼接
CONCAT_WS 用指定的分隔符拼接多个字符串或一个字符串数组。多数引擎会跳过 NULL 值,但 MaxCompute 只要有一个参数为 NULL 就返回 NULL。
各引擎写法
| 引擎 | 支持 | 写法 | 说明 | 依据 |
|---|---|---|---|---|
| MaxCompute | 支持 | CONCAT_WS(separator, str1, str2[, ...]) |
也支持 CONCAT_WS(separator, array)。没有参数或任一参数为 NULL 时返回 NULL,不会跳过 NULL。 | 官方文档 |
| Hologres | 支持 | CONCAT_WS(sep, str[, str ...]) |
分隔符为 NULL 时返回 NULL,NULL 值会被忽略。参数可以是任意类型。 | 官方文档 |
| StarRocks | 支持 | concat_ws(sep, str, ...) |
分隔符为 NULL 时返回 NULL。NULL 值会被跳过,空字符串不会被跳过。 | 官方文档 |
| Doris | 支持 | CONCAT_WS(sep, str[, str]) |
也支持 CONCAT_WS(sep, array)。分隔符为 NULL 时返回 NULL,NULL 值会被跳过,空字符串不会。 | 官方文档 |
| Hive | 支持 | concat_ws(SEP, A, B, ...) |
也支持 concat_ws(SEP, array<string>),数组写法从 Hive 0.9.0 起提供。 | 官方文档 |
| Spark SQL | 支持 | concat_ws(sep[, str | array(str)]+) |
Spark 1.5.0 起提供,跳过 NULL 值;分隔符为 NULL 时返回 NULL。 | 官方文档 |
| Flink SQL | 支持 | CONCAT_WS(string1, string2, string3, ...) |
第一个参数是分隔符,为 NULL 时返回 NULL;其余参数中的 NULL 会被跳过。 | 官方文档 |
迁移注意事项
- MaxCompute 的 CONCAT_WS 不跳过 NULL:CONCAT_WS(':', 'avg', NULL, '34') 返回 NULL,而 StarRocks、Doris、Spark 等引擎会返回 avg:34。迁出 MaxCompute 时结果会从 NULL 变成有值。
- 各引擎都会保留空字符串,只跳过 NULL。空字符串会在结果中留下连续的两个分隔符。
- 配合 COLLECT_LIST 使用时,CONCAT_WS(',', COLLECT_LIST(x)) 是 Hive 和 Spark 中按组拼接字符串的常用写法,元素顺序不固定。
示例
用斜杠拼接三级类目
SELECT CONCAT_WS('/', NVL(cat1, ''), NVL(cat2, ''), NVL(cat3, '')) FROM items;SELECT CONCAT_WS('/', cat1, cat2, cat3) FROM items;SELECT concat_ws('/', cat1, cat2, cat3) FROM items;