在SQL Server中,字符串串联最简单的方法是使用+号,例如:SELECT FirstName + ' ' + LastName AS FullName FROM Employees; 这会将名字和姓氏拼接成全名。但如果字段有NULL值,+号会使整个结果为NULL,所以常用ISNULL函数处理:SELECT ISNULL(FirstName,'') + ' ' + ISNULL(LastName,'') AS FullName FROM Employees;
使用CONCAT函数串联字符串
SQL Server 2012引入了CONCAT函数,它自动处理NULL值,不会让结果变NULL。语法:CONCAT(string1, string2, ...)。实例:SELECT CONCAT(FirstName, ' ', LastName) AS FullName FROM Employees; 即使FirstName是NULL,也会正常显示姓氏加空格。
STRING_AGG函数聚合多行字符串(SQL Server 2017+)
STRING_AGG是高效聚合字符串的函数:SELECT STRING_AGG(FirstName, ', ') AS AllNames FROM Employees; 这会将所有员工名字用逗号分隔拼接成一行,非常适合报表汇总,提升查询效率。
FOR XML PATH技巧实现串联
老版本SQL Server常用FOR XML PATH:SELECT STUFF((SELECT ',' + FirstName FROM Employees FOR XML PATH('')),1,1,'') AS AllNames; 这会生成逗号分隔的名字列表,STUFF用于去掉开头逗号,美观高效。
提升查询效率的串联技巧
避免在WHERE子句中使用串联,因为它无法利用索引。优先在SELECT中使用CONCAT或+。大表聚合时,用STRING_AGG比子查询+循环快很多,测试显示效率提升5-10倍。
代码美感:使用CTE和窗口函数
WITH NameCTE AS (SELECT FirstName, LastName, ROW_NUMBER() OVER(ORDER BY ID) AS RN FROM Employees) SELECT CONCAT(FirstName, '(', RN, ')') FROM NameCTE; 这样代码结构清晰,易读,结合窗口函数处理复杂拼接。
处理中文字符串串联
中文串联注意COLLATION:SELECT CONCAT(N'张三', N' ', N'李四') AS Name; 用N前缀确保Unicode支持,避免乱码,提升代码在多语言环境的美感。
FAQ
Q: +号串联遇到NULL怎么办?
A: 用ISNULL(field, '')包裹每个字段。
Q: 怎么串联多行数据?
A: SQL Server 2017+用STRING_AGG,老版本用FOR XML PATH。
Q: CONCAT和+号哪个更快?
A: CONCAT处理NULL更智能,效率相当,推荐新版本用CONCAT。
Q: 串联后怎么排序?
A: 在ORDER BY中使用相同串联表达式。