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

SQL中如何拆分字符串并将值插入同一行的不同列?

解决SQL Server 2016中STRING_SPLIT拆分后行转列的问题

嗨,我完全懂你的困扰——SQL Server 2016的STRING_SPLIT确实会把拆分后的每个值放到单独行里,而咱们需要把它们映射到同一行的不同列中。因为2016版本的STRING_SPLIT还没有ordinal参数(这个参数是2022版才新增的,用来保留拆分顺序),所以得手动生成序号区分两个日期,再通过条件聚合或PIVOT实现行转列。

方法一:CTE + 条件聚合

这是最直观的实现方式,先通过CTE拆分日期并生成行号,再用CASE语句把对应行号的日期映射到目标列:

WITH SplitDates AS (
    SELECT 
        [SIGN ON],
        value AS SplitDate,
        -- 按每个[SIGN ON]分组生成行号,确保顺序匹配拆分结果
        ROW_NUMBER() OVER (PARTITION BY [SIGN ON] ORDER BY (SELECT NULL)) AS RowNum
    FROM YourTable
    -- 用' / '作为分隔符拆分[SIGN ON]列
    CROSS APPLY STRING_SPLIT([SIGN ON], ' / ')
)
SELECT 
    [SIGN ON],
    -- 行号1对应第一个日期,填充到[SIGN OFF]列
    MAX(CASE WHEN RowNum = 1 THEN SplitDate END) AS [SIGN OFF],
    -- 行号2对应第二个日期,填充到[SIGN IN]列
    MAX(CASE WHEN RowNum = 2 THEN SplitDate END) AS [SIGN IN]
FROM SplitDates
GROUP BY [SIGN ON];

方法二:CTE + PIVOT

如果你更习惯PIVOT语法,也可以用这种方式实现:

WITH SplitDates AS (
    SELECT 
        [SIGN ON],
        value AS SplitDate,
        -- 生成标识列名,比如COL1、COL2
        'COL' + CAST(ROW_NUMBER() OVER (PARTITION BY [SIGN ON] ORDER BY (SELECT NULL)) AS VARCHAR(2)) AS ColAlias
    FROM YourTable
    CROSS APPLY STRING_SPLIT([SIGN ON], ' / ')
)
SELECT 
    [SIGN ON],
    COL1 AS [SIGN OFF],
    COL2 AS [SIGN IN]
FROM SplitDates
PIVOT (
    MAX(SplitDate)
    FOR ColAlias IN (COL1, COL2)
) AS PivotResult;

小提示

  • 这里用ORDER BY (SELECT NULL)依赖STRING_SPLIT从左到右的默认拆分顺序,只要你的[SIGN ON]列格式固定为日期1 / 日期2,这个顺序是可靠的。
  • 如果分隔符周围的空格不固定(比如有时是多个空格),可以先预处理列:REPLACE([SIGN ON], ' ', '')去掉所有空格,再用'/'作为分隔符拆分。

内容的提问来源于stack exchange,提问作者user30375

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.11 09:12:45