CONCAT函数自动将NULL转为空字符串,无需额外处理;但单参数CONCAT(NULL)返回NULL,且SQL Server 2012以下版本不支持该函数。

CONCAT 函数本身就会把 NULL 转成空字符串,不用额外处理
SQL Server 的 CONCAT 函数设计上就和 + 拼接不同:它会自动把所有 NULL 参数视作 ''(零长度字符串),不会导致整个结果变 NULL。这是它最核心的实用价值之一。
比如你写:
SELECT CONCAT('a', NULL, 'c');
结果就是 'ac',不是 NULL。这跟用 + 写 'a' + NULL + 'c' 完全不同——后者直接返回 NULL。
什么时候会“看似没生效”?常见干扰点
实际用的时候发现结果还是 NULL,大概率不是 CONCAT 本身的问题,而是下面这些情况:
- 传入的是表达式结果为
NULL,但该表达式本身出错(比如除零、类型转换失败),导致整行报错或被跳过 - 字段是
text或ntext类型(已弃用),CONCAT对它们支持不稳定,建议先CAST成VARCHAR或NVARCHAR - 误以为
CONCAT(NULL)返回空字符串 —— 实际上它返回NULL(因为没参数可拼)。至少得两个参数,CONCAT(NULL, '')才返回'' - 前端或工具把空字符串显示成空白/不可见,误判为
NULL;可用LEN()或DATALENGTH()验证
需要显式转空字符串?通常没必要,但有例外
绝大多数场景下,靠 CONCAT 自带行为就够了。只有两种情况你可能想主动干预:
- 想把
NULL统一替换成某个非空默认值(比如'N/A'),那就用ISNULL(col, 'N/A')或COALESCE(col, 'N/A')包一层再喂给CONCAT - 列里混着
''和NULL,而业务上要区分二者(比如日志记录),那不能依赖CONCAT的自动转换,得先用CASE WHEN col IS NULL THEN ... ELSE ... END显式分支
例如:
SELECT CONCAT('ID:', ISNULL(id, '0'), '-', name) FROM users;
这里 ISNULL(id, '0') 是为了把 NULL 强制转成字符 '0',而不是空字符串。
性能和兼容性提醒
CONCAT 是 SQL Server 2012+ 引入的,如果你还在用 2008R2 或更早版本,它根本不存在,会报 'CONCAT' is not a recognized built-in function name. 错误。
替代方案只能是:ISNULL(a,'') + ISNULL(b,'') + ISNULL(c,''),但要注意:如果任意一个操作数是 NULL,整个加法结果就是 NULL,所以每个都得套 ISNULL。
另外,CONCAT 会隐式把数字、日期等非字符串类型转成字符串(类似 STR() 或 CONVERT(VARCHAR, ...) 的效果),格式未必符合预期——比如 CONCAT(GETDATE()) 返回的是带毫秒的完整时间字符串,不是你想要的 '2024-05-20'。这时候就得提前 CONVERT(CHAR(10), GETDATE(), 120) 格式化好再拼。










