首页 / 字符串
CONCAT 字符串拼接
CONCAT 把多个字符串首尾相连。函数名在各引擎都一样,但遇到 NULL 的处理不同:MaxCompute、StarRocks、Doris 和 Flink 只要有一个参数为 NULL 就返回 NULL,Hologres 会直接忽略 NULL。
各引擎写法
| 引擎 | 支持 | 写法 | 说明 | 依据 |
|---|---|---|---|---|
| MaxCompute | 支持 | CONCAT(str1, str2[, ...]) |
任一参数为 NULL 或没有参数时返回 NULL。也可以拼接数组,此时任一数组为 NULL 返回 NULL。 | 官方文档 |
| Hologres | 支持 | CONCAT(str1, str2, ...) |
NULL 参数会被忽略:CONCAT('abcde', 2, NULL, 22) 返回 abcde222。 | 官方文档 |
| StarRocks | 支持 | concat(str, ...) |
任一参数为 NULL 时返回 NULL。 | 官方文档 |
| Doris | 支持 | CONCAT(expr[, expr ...]) |
任一参数为 NULL 时返回 NULL。 | 官方文档 |
| Hive | 支持 | concat(str1, str2, ...) |
也可以拼接 binary。函数手册没有说明 NULL 的处理方式。 | 官方文档 |
| Spark SQL | 支持 | concat(col1, col2, ..., colN) |
Spark 1.5.0 起提供,2.4.0 起也可以拼接数组。文档没有说明 NULL 的处理方式。 | 官方文档 |
| Flink SQL | 支持 | CONCAT(string1, string2, ...) |
任一参数为 NULL 时返回 NULL。 | 官方文档 |
迁移注意事项
- Hologres 的 CONCAT 忽略 NULL,其他引擎多数返回 NULL。同一条 SQL 从 MaxCompute 迁到 Hologres 后,原来为 NULL 的结果会变成非 NULL 的字符串,下游判断 IS NULL 的逻辑会失效。
- 需要“跳过 NULL 继续拼接”时,改用 CONCAT_WS,它在 StarRocks、Doris、Hologres、Spark 和 Flink 中都会跳过 NULL 值。
- 需要“有 NULL 就整体为 NULL”且行为在各引擎一致时,先用 NVL 或 COALESCE 处理每个参数,再拼接。
示例
拼接省份和城市
SELECT CONCAT(province, '-', city) FROM stores;SELECT CONCAT(province, '-', city) FROM stores; -- city 为 NULL 时返回 '浙江-'SELECT concat(province, '-', city) FROM stores;