SQL Server中如何反转单列字符串顺序并重新拼接?
嘿,这个需求我之前帮人解决过好多次,在SQL Server里实现其实有几种靠谱的办法,我给你详细说说:
方法1:用STRING_SPLIT + STRING_AGG(适合SQL Server 2016及以上)
这个方法比较简洁直观,适合新版本的SQL Server。核心思路是先把字符串按逗号拆分成独立的部分,再反转它们的顺序,最后用空格拼接起来。
-- 先准备测试数据 DECLARE @Names TABLE (FullName VARCHAR(100)); INSERT INTO @Names VALUES ('Smith,John'), ('Depp,Johnny'), ('Doe, Jane'); -- 这里故意留了逗号后的空格,测试trim效果 SELECT STRING_AGG(TRIM(Value), ' ') WITHIN GROUP (ORDER BY SplitOrder DESC) AS ReversedName FROM @Names CROSS APPLY ( -- 拆分字符串并给每个部分标序号 SELECT Value, ROW_NUMBER() OVER (ORDER BY (SELECT NULL)) AS SplitOrder FROM STRING_SPLIT(FullName, ',') ) AS SplitValues GROUP BY FullName;
这里的TRIM很重要,能自动处理逗号前后可能存在的多余空格;WITHIN GROUP (ORDER BY SplitOrder DESC)用来把拆分后的部分反转顺序,比如原来的"Smith,John"拆成"Smith"(序号1)和"John"(序号2),倒序后就变成先取"John"再取"Smith",拼接后就是"John Smith"。
方法2:兼容旧版本(SQL Server 2016以下)
如果你的SQL Server版本比较老,不支持STRING_SPLIT和STRING_AGG,那用CHARINDEX和SUBSTRING手动截取是最稳妥的方案:
-- 同样准备测试数据 DECLARE @Names TABLE (FullName VARCHAR(100)); INSERT INTO @Names VALUES ('Smith,John'), ('Depp,Johnny'), ('Doe, Jane'); SELECT CASE WHEN CHARINDEX(',', FullName) > 0 THEN TRIM(SUBSTRING(FullName, CHARINDEX(',', FullName) + 1, LEN(FullName))) + ' ' + TRIM(SUBSTRING(FullName, 1, CHARINDEX(',', FullName) - 1)) ELSE FullName -- 处理没有逗号的情况,直接返回原字符串 END AS ReversedName FROM @Names;
解释一下:
CHARINDEX(',', FullName)找到逗号在字符串里的位置SUBSTRING(FullName, CHARINDEX(',', FullName) + 1, LEN(FullName))截取逗号后面的所有内容,用TRIM去掉多余空格- 再拼接一个空格和逗号前面截取并trim后的内容,就得到了反转后的名字
- 加了
CASE判断,避免遇到没有逗号的字符串时出错
额外注意事项
- 如果你的数据里存在多个逗号的情况(比如"Smith,John,A."),那方法1会把所有拆分部分反转,方法2只会处理第一个逗号。如果需要处理多逗号场景,得根据具体需求调整逻辑。
- 记得测试边缘情况,比如空字符串、只有逗号的字符串,避免出现异常结果。
内容的提问来源于stack exchange,提问作者Binyamin W.
相关产品推荐
相关产品推荐

