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
相关产品推荐
相关产品推荐

