You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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;

解释一下:

  1. CHARINDEX(',', FullName)找到逗号在字符串里的位置
  2. SUBSTRING(FullName, CHARINDEX(',', FullName) + 1, LEN(FullName))截取逗号后面的所有内容,用TRIM去掉多余空格
  3. 再拼接一个空格和逗号前面截取并trim后的内容,就得到了反转后的名字
  4. 加了CASE判断,避免遇到没有逗号的字符串时出错
额外注意事项
  • 如果你的数据里存在多个逗号的情况(比如"Smith,John,A."),那方法1会把所有拆分部分反转,方法2只会处理第一个逗号。如果需要处理多逗号场景,得根据具体需求调整逻辑。
  • 记得测试边缘情况,比如空字符串、只有逗号的字符串,避免出现异常结果。

内容的提问来源于stack exchange,提问作者Binyamin W.

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.07 09:52:38